MySQL分区表, partition

MySQL分区表, partition 没有分区的表创建分区 partition management on a not partitioned table is not possible ALTER TABLE table0 PARTITION BY RANGE (to_days(field0)) ( PARTITION p201908 VALUES less THAN (737668), PARTITION p201909 VALUES LESS THAN (737698), PARTITION p201910 VALUES LESS THAN (737729), PARTITION p201911 VALUES LESS THAN (737759), PARTITION p201912 VALUES LESS THAN (737790) ) ALTER TABLE table0 PARTITION BY RANGE (to_days(field0)) ( PARTITION p202007 VALUES less THAN (to_days('2020-08-01')), PARTITION p202008 VALUES less THAN (to_days('2020-09-01')), PARTITION p202009 VALUES less THAN (to_days('2020-10-01')), PARTITION p202010 VALUES less THAN (to_days('2020-11-01')), PARTITION p202011 VALUES less THAN (to_days('2020-12-01')), PARTITION p202012 VALUES less THAN (to_days('2021-01-01')), ) 添加分区 alter TABLE table0 add PARTITION ( PARTITION p201908 VALUES less THAN (737668)); alter table table0 add PARTITION ( PARTITION pmax VALUES less than MAXVALUE); -- check partition size USE information_schema; SELECT PARTITION_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 't0' and PARTITION_NAME='p0'; -- drop partition ALTER TABLE `db0`.t0 DROP PARTITION p0; 查看分区的存储情况 SELECT partition_name, PARTITION_DESCRIPTION, PARTITION_EXPRESSION, table_rows FROM information_schema.partitions WHERE table_name = 'table0' 查询 查询的where条件要写完整的时间范围, 只写> 或者只写<, 会导致查询所有的分区. ...

2017-04-07 · 5 min · 981 words · -

MySQL btree索引 hash索引

‘MySQL btree索引 hash索引’ MySQL, b tree索引 hash索引, B树 http://www.cnblogs.com/vicenteforever/articles/1789613.html Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。可 能很多人又有疑问了,既然 Hash 索引的效率要比 B-Tree 高很多,为什么大家不都用 Hash 索引而还要使用 B-Tree 索引呢?任何事物都是有两面性的,Hash 索引也一样,虽然 Hash 索引效率高,但是 Hash 索引本身由于其特殊性也带来了很多限制和弊端,主要有以下这些。 (1) Hash 索引仅仅能满足"=",“IN"和”<=>“查询,不能使用范围查询。 由于 Hash 索引比较的是进行 Hash 运算之后的 Hash 值,所以它只能用于等值的过滤,不能用于基于范围的过滤,因为经过相应的 Hash 算法处理之后的 Hash 值的大小关系,并不能保证和Hash运算前完全一样。 (2) Hash 索引无法被用来避免数据的排序操作。 由于 Hash 索引中存放的是经过 Hash 计算之后的 Hash 值,而且Hash值的大小关系并不一定和 Hash 运算前的键值完全一样,所以数据库无法利用索引的数据来避免任何排序运算; (3) Hash 索引不能利用部分索引键查询。 对于组合索引,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用。 (4) Hash 索引在任何时候都不能避免表扫描。 ...

2015-10-15 · 1 min · 94 words · -

MySQL replace into

MySQL replace into http://my.oschina.net/junn/blog/110213 Replace into是Insert into的增强版。在向表中插入数据时,我们经常会遇到这样的情况: 1、首先判断数据是否存在;2、如果不存在,则插入;3、如果存在,则更新。 在SQL Server中可以这样处理: if not exists (select 1 from t where id = 1) insert into t(id, update_time) values(1, getdate()) else update t set update_time = getdate() where id = 1 那么 MySQL 中如何实现这样的逻辑呢?MySQL 中有更简单的方法: replace into replace into t(id, update_time) values(1, now()); 或 replace into t(id, update_time) select 1, now(); replace into 跟 insert 功能类似,不同点在于: replace into 首先尝试插入数据到表中, 1. 如果发现表中已经有此行数据 (根据主键或者唯一索引判断) 则先删除此行数据,然后插入新的数据。 2. 否则,直接插入新数据。 ...

2015-08-14 · 2 min · 216 words · -

MySQL 存储引擎 Memory

MySQL 存储引擎 Memory http://samyubw.blog.51cto.com/978243/223769 Memory存储引擎使用存在内存中的内容来创建表,每个Memory表只实际对应一个磁盘文件,在磁盘中表现为.frm文件。Memory类型的表访问速度非常快,因为它的数据是放在内存中的,并且默认使用hash索引,但是一旦服务关闭,表中的数据就会丢失。 示例: create table memory_tab(id int)engine=memory; 因为memory在MySQLd重启后数据就会丢失,为了获得稳定的数据源,可以在启动MySQLd时加上—init-file选项,把insert into memory_tab select 或load data infile类似的语句放进去即可。 另外因为memory表是把数据放到内存中的,所以服务器需要有足够的内存来维持所有在同一时间使用的memory表,注意对连接MySQLd的所有用户连接 共享 内存表中的数据,根据应用如果不是在所有连接间共享数据,最好在内存表中加入标志各个连接的ID。当不再需要memory数据时,要记得去删除自己连接的数据。 对于内存表的官方说明: The MEMORY storage engine creates tables with contents that are stored in memory. Formerly, these were known as HEAP tables. MEMORY is the preferred term, although HEAP remains supported for backward compatibility. Each MEMORY table is associated with one disk file. The filename begins with the table name and has an extension of .frm to indicate that it stores the table definition. ...

2015-06-28 · 1 min · 196 words · -

MySQL 存储引擎

MySQL 存储引擎 什么是存储引擎? 关系数据库表是用于存储和组织信息的数据结构,可以将表理解为由行和列组成的表格,类似于Excel的电子表格的形式。有的表简单,有的表复杂,有的表根本不用来存储任何长期的数据,有的表读取时非常快,但是插入数据时去很差;而我们在实际开发过程中,就可能需要各种各样的表,不同的表,就意味着存储不同类型的数据,数据的处理上也会存在着差异,那么。对于MySQL来说,它提供了很多种类型的存储引擎,我们可以根据对数据处理的需求,选择不同的存储引擎,从而最大限度的利用MySQL强大的功能。这篇博文将总结和分析各个引擎的特点,以及适用场合,并不会纠结于更深层次的东西。我的学习方法是先学会用,懂得怎么用,再去知道到底是如何能用的。下面就对MySQL支持的存储引擎进行简单的介绍。 MyISAM MyISAM 发音为 “my-z[ei]m”; 在MySQL客户端中,使用以下命令可以查看MySQL支持的引擎:show engines; MyISAM表是独立于操作系统的,这说明可以轻松地将其从Windows服务器移植到Linux服务器;每当我们建立一个MyISAM引擎的表时,就会在本地磁盘上建立三个文件,文件名就是表明。例如,我建立了一个MyISAM引擎的tb_Demo表,那么就会生成以下三个文件: tb_demo.frm,存储表定义; tb_demo.MYD,存储数据; tb_demo.MYI,存储索引。 MyISAM表无法处理事务,这就意味着有事务处理需求的表,不能使用MyISAM存储引擎。MyISAM存储引擎特别适合在以下几种情况下使用: 选择密集型的表。MyISAM存储引擎在筛选大量数据时非常迅速,这是它最突出的优点。 插入密集型的表。MyISAM的并发插入特性允许同时选择和插入数据。例如: MyISAM存储引擎很适合管理邮件或Web服务器日志数据。 InnoDB InnoDB是一个健壮的事务型存储引擎,这种存储引擎已经被很多互联网公司使用,为用户操作非常大的数据存储提供了一个强大的解决方案。我的电脑上安装的MySQL 5.6.13版,InnoDB就是作为默认的存储引擎。InnoDB还引入了行级锁定和外键约束,在以下场合下,使用InnoDB是最理想的选择: 更新密集的表。InnoDB存储引擎特别适合处理多重并发的更新请求。 事务。InnoDB存储引擎是支持事务的标准MySQL存储引擎。 自动灾难恢复。与其它存储引擎不同,InnoDB表能够自动从灾难中恢复。 外键约束。MySQL支持外键的存储引擎只有InnoDB。 支持自动增加列AUTO_INCREMENT属性。 一般来说,如果需要事务支持,并且有较高的并发读取频率,InnoDB是不错的选择。 MEMORY 使用MySQL Memory存储引擎的出发点是速度。为得到最快的响应时间,采用的逻辑存储介质是系统内存。虽然在内存中存储表数据确实会提供很高的性能,但当MySQLd守护进程崩溃时,所有的Memory数据都会丢失。获得速度的同时也带来了一些缺陷。它要求存储在Memory数据表里的数据使用的是长度不变的格式,这意味着不能使用BLOB和TEXT这样的长度可变的数据类型,VARCHAR是一种长度可变的类型,但因为它在MySQL内部当做长度固定不变的CHAR类型,所以可以使用。 一般在以下几种情况下使用Memory存储引擎: 目标数据较小,而且被非常频繁地访问。在内存中存放数据,所以会造成内存的使用,可以通过参数max_heap_table_size控制Memory表的大小,设置此参数,就可以限制Memory表的最大大小。 如果数据是临时的,而且要求必须立即可用,那么就可以存放在内存表中。 存储在Memory表中的数据如果突然丢失,不会对应用服务产生实质的负面影响。 Memory同时支持散列索引和B树索引。B树索引的优于散列索引的是,可以使用部分查询和通配查询,也可以使用<、>和>=等操作符方便数据挖掘。散列索引进行"相等比较"非常快,但是对"范围比较"的速度就慢多了,因此散列索引值适合使用在=和<>的操作符中,不适合在<或>操作符中,也同样不适合用在order by子句中。 可以在表创建时利用USING子句指定要使用的版本。例如: create table users ( id smallint unsigned not null auto_increment, username varchar(15) not null, pwd varchar(15) not null, index using hash (username), primary key (id) )engine=memory; 上述代码创建了一个表,在username字段上使用了HASH散列索引。下面的代码就创建一个表,使用BTREE索引。 create table users ( id smallint unsigned not null auto_increment, ...

2015-06-28 · 2 min · 405 words · -

MySQL 字典表

MySQL 字典表 select column_key,COLUMN_NAME,column_type,is_nullable,column_comment from INFORMATION_SCHEMA.Columns where table_name=" and table_schema=" 显示数据库列表 MySQL>show databases; -- 说明: 其中字典库是: information_schema,其中常用字典表: INFORMATION_SCHEMA.SCHEMATA -数据库中所有数据库信息 INFORMATION_SCHEMA.TABLES -存放数据库中所有数据库表信息 INFORMATION_SCHEMA.COLUMNS -所有数据库表的列信息 INFORMATION_SCHEMA.STATISTICS -存放索引信息 INFORMATION_SCHEMA.USER_PRIVILEGES - INFORMATION_SCHEMA.SCHEMA_PRIVILEGES INFORMATION_SCHEMA.TABLE_PRIVILEGES INFORMATION_SCHEMA.COLUMN_PRIVILEGES INFORMATION_SCHEMA.CHARACTER_SETS INFORMATION_SCHEMA.COLLATIONS INFORMATION_SCHEMA.COLLATION_CHARACTER_SET_APPLICABILITY INFORMATION_SCHEMA.TABLE_CONSTRAINTS INFORMATION_SCHEMA.KEY_COLUMN_USAGE -存放数据库里所有具有约束的键信息 INFORMATION_SCHEMA.ROUTINES INFORMATION_SCHEMA.VIEWS -存放所有视图信息 INFORMATION_SCHEMA.TRIGGERS -触发器信息 2、显示当前连接的数据库 MySQL>select database(); 3、显示库中的数据表: MySQL>use MySQL;(指定MySQL库) MySQL>show tables; 4、显示数据表的结构: MySQL>describe yourtablename; 说明: describe 可以简写成desc 5、建库: MySQL>create database yourdbname; 6、建表: MySQL>create table yourtablename (columnname colunmtype, …); ...

2015-05-25 · 2 min · 246 words · -

MySQL install

MySQL install debian install MySQL server sudo apt-get install MySQL-server 一、下载MySQL安装包 安装包名称: MySQL-5.6.12-win32.zip 下载地址: http://dev.MySQL.com/downloads/MySQL/ 二、安装MySQL 2.1 修改配置文件my.ini 将MySQL-5.6.12-win32.zip解压拷贝到F:\ 修改F:\MySQL-5.6.12-win32.zip目录下的配置文件my.ini如下: [client] port = 3306 [MySQL] [MySQLd] bind-address = 0.0.0.0 basedir=D:/apps/MySQL-5.6.23-winx64 datadir=D:/apps/MySQL-5.6.23-winx64/data max_connections=200 character-set-server=utf8 port=3306 try to start MySQL with console MySQLd -console 2.2 安装MySQL为windows系统服务 以管理员身份(Run as administrator)启动cmd,切换到目录F:/MySQL-5.6.12-win32/bin MySQLd.exe -install 如果以普通用户执行该命令会提示Install/Remove of the Service Denied! 三、启动MySQL服务 3.1 启动MySQL服务 以管理员身份启动cmd,切换到目录F:/MySQL-5.6.12-win32/bin 启动MySQL服务: net start MySQL 四、执行命令 4.1 登录MySQL MySQL -u root -p ...

2015-04-04 · 1 min · 84 words · -

设置MySQL允许外网访问

设置MySQL允许外网访问 1.修改配置文件 sudo vim /etc/MySQL/my.cnf 把bind-address参数的值改成你的内/外网IP或0.0.0.0,或者直接注释掉这行. 解决MySQL不允许从远程访问的方法 解决方法: 1。改表法。可能是你的帐号不允许从远程登陆,只能在localhost。这个时候只要在localhost的那台电脑,登入MySQL后,更改 “MySQL” 数据库里的 “user” 表里的 “host” 项,从"localhost"改称"%" MySQL -u root -pvmwareMySQL>use MySQL; MySQL>update user set host = ‘%’ where user = ‘root’; MySQL>select host, user from user; MySQL>FLUSH PRIVILEGES 使修改生效.就可以了

2015-02-10 · 1 min · 38 words · -

MySQL "ON DUPLICATE KEY UPDATE"

MySQL “ON DUPLICATE KEY UPDATE” 如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE;如果不会导致唯一值列重复的问题,则插入新行。 例如,如果列 a 为 主键 或 拥有UNIQUE索引,并且包含值1,则以下两个语句具有相同的效果: INSERT INTO TABLE (a,c) VALUES (1,3) ON DUPLICATE KEY UPDATE c=c+1; UPDATE TABLE SET c=c+1 WHERE a=1; 如果行作为新记录被插入,则受影响行的值显示1;如果原有的记录被更新,则受影响行的值显示2。 这个语法还可以这样用: 如果INSERT多行记录(假设 a 为主键或 a 是一个 UNIQUE索引列): 1.INSERT INTO TABLE (a,c) VALUES (1,3),(1,7) ON DUPLICATE KEY UPDATE c=c+1; 执行后, c 的值会变为 4 (第二条与第一条重复, c 在原值上+1). 2.INSERT INTO TABLE (a,c) VALUES (1,3),(1,7) ON DUPLICATE KEY UPDATE c=VALUES(c); ...

2014-05-21 · 1 min · 85 words · -

MySQL 日志 log

MySQL 日志 log https://mariadb.com/kb/en/mariadb/general-query-log/ 查询日志: 编辑/etc/MySQL/my.cnf, 在[MySQLd]段下添加以下三行并重启MySQL(MySQL用户写权限) general-log=1 general-log-file=/data/logs/MySQL/MySQL.log log-output=file 查看配置: SHOW GLOBAL VARIABLES LIKE '%log%'; MySQL日志: 主要包含: 错误日志、查询日志、慢查询日志、事务日志、二进制日志; 日志是MySQL数据库的重要组成部分。日志文件中记录着MySQL数据库运行期间发生的变化;也就是说用来记录MySQL数据库的客户端连接状况、SQL语句的执行情况和错误信息等。当数据库遭到意外的损坏时,可以通过日志查看文件出错的原因,并且可以通过日志文件进行数据恢复。 错误日志 在MySQL数据库中,错误日志功能是默认开启的。并且,错误日志无法被禁止。默认情况下,错误日志存储在MySQL数据库的数据文件中。错误日志文件通常的名称为hostname.err。其中,hostname表示服务器主机名。 错误日志信息可以自己进行配置的,错误日志所记录的信息是可以通过log-error和log-warnings来定义的,其中log-err是定义是否启用错误日志的功能和错误日志的存储位置,log-warnings是定义是否将警告信息也定义至错误日志中。默认情况下错误日志大概记录以下几个方面的信息: 服务器启动和关闭过程中的信息 (未必是错误信息,如MySQL如何启动InnoDB的表空间文件的、如何初始化自己的存储引擎的等等) 、服务器运行过程中的错误信息、事件调度器运行一个事件时产生的信息、在从服务器上启动服务器进程时产生的信息。 下面我们来定义MySQL错误日志的功能: 一般而言,日志级别的定义没有回话变量都只是在全局级别下进行定义。 MySQL> SHOW GLOBAL VARIABLES LIKE ‘%log%’; +————–+————+ | Variable_name | Value | +————–+————+ | back_log | 50 | | binlog_cache_size | 32768 | | binlog_direct_non_transactional_updates | OFF | | binlog_format | MIXED | | binlog_stmt_cache_size | 32768 | | expire_logs_days | 0 | | general_log | OFF | | general_log_file | /mydata/data/stu18.log | ...

2014-05-07 · 10 min · 2093 words · -

MySQL中的datetime与timestamp

MySQL中的datetime与timestamp 相同 显示 TIMESTAMP列的显示格式与DATETIME列相同。换句话说,显示宽度固定在19字符,并且格式为YYYY-MM-DD HH:MM:SS。 不同 范围 datetime 以’YYYY-MM-DD HH:MM:SS’格式检索和显示DATETIME值。支持的范围为'1000-01-01 00:00:00’到'9999-12-31 23:59:59’TIMESTAMP值不能早于1970或晚于2037 储存 TIMESTAMP 1.4个字节储存 (Time stamp value is stored in 4 bytes) 2.值以UTC格式保存 ( it stores the number of milliseconds) 3.时区转化 ,存储时对当前的时区进行转换,检索时再转换回当前的时区。 datetime 1.8个字节储存 (8 bytes storage) 2.实际格式储存 (Just stores what you have stored and retrieves the same thing which you have stored.) 3.与时区无关 (It has nothing to deal with the TIMEZONE and Conversion.) 实例对比 现在我来做个时区对他们的影响。 1.先插入一个数据insert into `t8` values(now(), now()); ...

2014-05-07 · 1 min · 128 words · -

在MySQL中修改表名的sql语句

在MySQL中修改表名的sql语句 http://blog.csdn.net/xrt95050/article/details/2441458 在使用MySQL时,经常遇到表名不符合规范或标准,但是表里已经有大量的数据了,如何保留数据,只更改表名呢? 可以通过建一个相同的表结构的表,把原来的数据导入到新表中,但是这样视乎很麻烦。 能否简单使用一个SQL语句就搞定呢?当然可以,MySQL5.0下我们使用这样的SQL语句就可以了。 ALTER TABLE table_name RENAME TO new_table_name 例如 ALTER TABLE admin_user RENAME TO a_user

2014-04-09 · 1 min · 18 words · -

MySQL的大小写敏感性 lower_case_table_names

MySQL的大小写敏感性 lower_case_table_names MySQL的大小写敏感性 lower_case_table_names 在 MySQL 中,数据库和表对就于那些目录下的目录和文件。因而,操作系统的敏感性决定数据库和表命名的大小写敏感。这就意味着数据库和表名在 Windows 中是大小写不敏感的,而在大多数类型的 Unix 系统中是大小写敏感的。 奇怪的是列名与列的别名在所有的情况下均是忽略大小写的,而表的别名又是区分大小写的。 要避免这个问题,你最好在定义数据库命名规则的时候就全部采用小写字母加下划线的组合,而不使用任何的大写字母。 或者也可以强制以 -O lower_case_table_names=1 参数启动 MySQLd (如果使用 -defaults-file=…\my.cnf 参数来读取指定的配置文件启动 MySQLd 的话,你需要在配置文件的 [MySQLd] 区段下增加一行 lower_case_table_names=1) 。这样MySQL 将在创建与查找时将所有的表名自动转换为小写字符 (这个选项缺省地在 Windows 中为 1 ,在 Unix 中为 0。从 MySQL 4.0.2 开始,这个选项同样适用于数据库名) 。 当你更改这个选项时,你必须在启动 MySQLd 前首先将老的表名转换为小写字母。 换句话说,如果你希望在数据库里面创建表的时候保留大小写字符状态,则应该把这个参数置: lower_case_table_names=0 。否则的话你会发现同样的sqldump脚本在不同的操作系统下最终导入的结果不一样 (在Windows下所有的大写字符都变成小写了) 。 值 含义 使用CREATE TABLE或CREATE DATABASE语句指定的大写和小写在硬盘上保存表名和数据库名。名称比较对大小写敏感。在Unix系统中的默认设置即如此。请注意如果在大小写不敏感的文件系统上用-lower-case-table-names=0强制设为0,并且使用不同的大小写访问MyISAM表名,会导致索引破坏。 1 表名在硬盘上以小写保存,名称比较对大小写敏感。MySQL将所有表名转换为小写以便存储和查找。该行为也适合数据库名和表的别名。该值为Windows和Mac OS X系统中的默认值。 2 表名和数据库名在硬盘上使用CREATE TABLE或CREATE DATABASE语句指定的大小写进行保存,但MySQL将它们转换为小写以便查找。名称比较对大小写敏感。注释: 只 在对大小写不敏感的文件系统上适用! InnoDB表名以小写保存,例如lower_case_tables_name=1。 MySQL的大小写敏感其实是根据用户的操作系统来的, 可以强制以 -O lower_case_table_names=1 参数启动 MySQLd (如果使用 -defaults-file=…\my.cnf 参数来读取指定的配置文件启动 MySQLd 的话,你需要在配置文件的 [MySQLd] 区段下增加一行 lower_case_table_names=1) 。 ...

2014-04-09 · 1 min · 171 words · -

MySQL 索引

MySQL 索引 - 显示索引信息 SHOW INDEX FROM table_name; SHOW keys FROM table_name; - create index CREATE INDEX indexName ON mytable(username(length)); - 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。 ALTER TABLE tbl_name ADD PRIMARY KEY (column_list); - 这条语句创建索引的值必须是唯一的 (除了NULL外,NULL可能会出现多次) 。 ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): - 添加普通索引,索引值可出现多次。 ALTER TABLE tbl_name ADD INDEX index_name (column_list): - 该语句指定了索引为 FULLTEXT ,用于全文索引。 ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list): ALTER TABLE testalter_tbl DROP PRIMARY KEY; ALTER TABLE testalter_tbl DROP INDEX c; SHOW INDEX FROM table_name; ...

2014-01-20 · 3 min · 466 words · -

innodb_autoinc_lock_mode

innodb_autoinc_lock_mode innodb_autoinc_lock_mode这个参数控制着在向有auto_increment 列的表插入数据时,相关锁的行为; 通过对它的设置可以达到性能与安全(主从的数据一致性)的平衡 【0】我们先对insert做一下分类 首先insert大致上可以分成三类: 1、simple insert 如insert into t(name) values(’test’) 2、bulk insert 如load data | insert into … select …. from …. 3、mixed insert 如insert into t(id,name) values(1,‘a’),(null,‘b’),(5,‘c’); 【1】innodb_autoinc_lock_mode 的说明 innodb_auto_lockmode有三个取值: 1、0 这个表示tradition 传统 2、1 这个表示consecutive 连续 3、2 这个表示interleaved 交错 【1.1】tradition(innodb_autoinc_lock_mode=0) 模式: 1、它提供了一个向后兼容的能力 2、在这一模式下,所有的insert语句(“insert like”) 都要在语句开始的时候得到一个 表级的auto_inc锁,在语句结束的时候才释放这把锁,注意呀,这里说的是语句级而不是事务级的, 一个事务可能包涵有一个或多个语句。 3、它能保证值分配的可预见性,与连续性,可重复性,这个也就保证了insert语句在复制到slave 的时候还能生成和master那边一样的值(它保证了基于语句复制的安全)。 4、由于在这种模式下auto_inc锁一直要保持到语句的结束,所以这个就影响到了并发的插入。 【1.2】consecutive(innodb_autoinc_lock_mode=1) 模式: 1、这一模式下去simple insert 做了优化,由于simple insert一次性插入值的个数可以立马得到 确定,所以mysql可以一次生成几个连续的值,用于这个insert语句;总的来说这个对复制也是安全的 (它保证了基于语句复制的安全) 2、这一模式也是mysql的默认模式,这个模式的好处是auto_inc锁不要一直保持到语句的结束,只要 语句得到了相应的值后就可以提前释放锁 【1.3】interleaved(innodb_autoinc_lock_mode=2) 模式 1、由于这个模式下已经没有了auto_inc锁,所以这个模式下的性能是最好的;但是它也有一个问题,就是 对于同一个语句来说它所得到的auto_incremant值可能不是连续的。 【2】如果你的二进制文件格式是mixed | row 那么这三个值中的任何一个对于你来说都是复制安全的。 ...

2014-01-20 · 1 min · 75 words · -

MySQL 横表和纵表转换

MySQL 横表和纵表转换 (1) 表tb1有如下数据: 姓名 语文 数学 物理 张三 68 89 99 李四 90 66 78 现在要求写出查询语句得到如下查询结果 name subject score 张三 语文 68 张三 数学 89 张三 物理 99 李四 语文 90 李四 数学 66 李四 物理 78 sql语句如下: select 姓名 as name,‘语文’ as subject,语文 as score from tb1 union select 姓名 as name,‘数学’ as subject,数学 as score from tb1 union select 姓名 as name,‘物理’ as subject,物理 as score from tb1 ...

2014-01-17 · 2 min · 252 words · -

MySQL if

MySQL if IF表达式 IF(expr1,expr2,expr3) 如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为expr2; 否则返回值则为 expr3。IF() 的返回值为数字值或字符串值,具体情况视其所在语境而定。 select *,if(sva=1,"男","女") as ssva from taname where sva != "" 作为表达式的if也可以用CASE when来实现: select CASE sva WHEN 1 THEN '男' ELSE '女' END as ssva from taname where sva != '' 在第一个方案的返回结果中, value=compare-value 而第二个方案的返回结果是第一种情况的真实结果。如果没有匹配的结果值,则返回结果为ELSE后的结果,如果没有ELSE 部分,则返回值为 NULL。 SELECT CASE 1 WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 'more' END as testCol -- 将输出one http://outofmemory.cn/code-snippet/1149/MySQL-if-case-statement-usage-summary

2014-01-16 · 1 min · 72 words · -

MySQL 字符串连接 CONCAT()

‘MySQL 字符串连接 CONCAT()’ MySQL> SELECT CONCAT('My', 'S', 'QL'); -> 'MySQL' MySQL CONCAT () 函数用于将多个字符串连接成一个字符串 MySQL CONCAT(str1,str2,…) 返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。或许有一个或多个参数。 如果所有参数均为非二进制字符串,则结果为非二进制字符串。 如果自变量中含有任一二进制字符串,则结果为一个二进制字符串。一个数字参数被转化为与之相等的二进制字符串格式;若要避免这种情况,可使用显式类型 cast, 例如: SELECT CONCAT(CAST(int_col AS CHAR), char_col) MySQL> SELECT CONCAT(‘My’, ‘S’, ‘QL’); -> ‘MySQL’ MySQL> SELECT CONCAT(‘My’, NULL, ‘QL’); -> NULL MySQL> SELECT CONCAT(14.3); -> ‘14.3′ MySQL CONCAT_WS(separator,str1,str2,…) CONCAT_WS() 代表 CONCAT With Separator ,是CONCAT()的特殊形式。 第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。如果分隔符为 NULL,则结果为 NULL。函数会忽略任何分隔符参数后的 NULL 值。 MySQL> SELECT CONCAT_WS(’,’,‘First name’,‘Second name’,‘Last Name’); -> ‘First name,Second name,Last Name’ ...

2014-01-16 · 1 min · 86 words · -

MySQL 里的IFNULL、NULLIF和ISNULL用法

MySQL 里的IFNULL、NULLIF和ISNULL用法 今天用到了MySQL里的isnull才发现他和MSSQL里的还是有点区别,现在简单总结一下: **MySQL中isnull,ifnull,nullif的用法如下: ** **isnull(expr) 的用法: ** 如expr 为null,那么isnull() 的返回值为 1,否则返回值为 0。 MySQL> select isnull(1+1); -> 0 MySQL> select isnull(1/0); -> 1 使用= 的null 值对比通常是错误的。 isnull() 函数同 is null比较操作符具有一些相同的特性。请参见有关is null 的说明。 **IFNULL(expr1,expr2)的用法: ** 假如expr1 不为 NULL,则 IFNULL() 的返回值为 expr1; 否则其返回值为 expr2。IFNULL()的返回值是数字或是字符串,具体情况取决于其所使用的语境。 MySQL> SELECT IFNULL(1,0); -> 1 MySQL> SELECT IFNULL(NULL,10); -> 10 MySQL> SELECT IFNULL(1/0,10); -> 10 MySQL> SELECT IFNULL(1/0,‘yes’); -> ‘yes’ IFNULL(expr1,expr2)的默认结果值为两个表达式中更加"通用"的一个,顺序为STRING、 REAL或 INTEGER。假设一个基于表达式的表的情况, 或MySQL必须在内存储器中储存一个临时表中IFNULL()的返回值: CREATE TABLE tmp SELECT IFNULL(1,’test’) AS test; ...

2014-01-16 · 1 min · 108 words · -

MySQL coalesce

MySQL coalesce coalesce函数表示可以返回参数中的第一个非空表达式,当你有N个参数时选取第一个非空值 (从左到右) 。 实例一: select coalesce (null,“carrot”,“apple”) 返回结果: carrot 实例二: select coalesce(1,“carrot”,“apple”) 返回结果: 1 友情提示: coalesce里的参数如果是字符串的话,务必用单引号或者双引号廓起来; 这些语句可以直接在MySQL里运行。 http://hi.baidu.com/luoganet/item/7ec497dec10c88e2795daa1f

2014-01-16 · 1 min · 20 words · -