草庐IT

MySQL实战45讲 20

20|幻读是什么,幻读有什么问题?建表和初始化语句如下CREATETABLE`t`(`id`int(11)NOTNULL,`c`int(11)DEFAULTNULL,`d`int(11)DEFAULTNULL,PRIMARYKEY(`id`),KEY`c`(`c`))ENGINE=InnoDB;insertintotvalues(0,0,0),(5,5,5),(10,10,10),(15,15,15),(20,20,20),(25,25,25);这个表除了主键id外,还有一个索引c,初始化语句在表中插入了6行数据。Q:下面的语句序列,是怎么加锁的,加的锁又是什么时候释放的呢?begin;sel

MySQL实战45讲 20

20|幻读是什么,幻读有什么问题?建表和初始化语句如下CREATETABLE`t`(`id`int(11)NOTNULL,`c`int(11)DEFAULTNULL,`d`int(11)DEFAULTNULL,PRIMARYKEY(`id`),KEY`c`(`c`))ENGINE=InnoDB;insertintotvalues(0,0,0),(5,5,5),(10,10,10),(15,15,15),(20,20,20),(25,25,25);这个表除了主键id外,还有一个索引c,初始化语句在表中插入了6行数据。Q:下面的语句序列,是怎么加锁的,加的锁又是什么时候释放的呢?begin;sel

MySQL实战45讲 18

18|为什么这些SQL语句逻辑相同,性能却差异巨大?在MySQL中,有很多看上去逻辑相同,但性能却差异巨大的SQL语句。对这些语句使用不当的话,就会不经意间导致整个数据库的压力变大。三个案例案例一:条件字段函数操作假设你现在维护了一个交易系统,其中交易记录表tradelog包含交易流水号(tradeid)、交易员id(operator)、交易时间(t_modified)等字段,先忽略其他字段。这个表的建表语句如下:CREATETABLE`tradelog`(`id`int(11)NOTNULL,`tradeid`varchar(32)DEFAULTNULL,`operator`int(11)D

MySQL实战45讲 18

18|为什么这些SQL语句逻辑相同,性能却差异巨大?在MySQL中,有很多看上去逻辑相同,但性能却差异巨大的SQL语句。对这些语句使用不当的话,就会不经意间导致整个数据库的压力变大。三个案例案例一:条件字段函数操作假设你现在维护了一个交易系统,其中交易记录表tradelog包含交易流水号(tradeid)、交易员id(operator)、交易时间(t_modified)等字段,先忽略其他字段。这个表的建表语句如下:CREATETABLE`tradelog`(`id`int(11)NOTNULL,`tradeid`varchar(32)DEFAULTNULL,`operator`int(11)D

MySQL实战45讲 15

15|答疑文章(一):日志和索引相关问题日志相关binlog(归档日志)和redolog(重做日志)配合崩溃恢复,在两阶段提交的不同瞬间,MySQL如果发生异常重启,是怎么保证数据完整性的?Q:这个图不是一个update语句的执行流程吗,怎么还会调用commit语句?A:两个“commit”的概念“commit语句”是指MySQL语法中,用于提交一个事务的命令。一般跟begin/starttransaction配对使用。而图中用到的这个“commit步骤”,指的是事务提交过程中的一个小步骤,也是最后一步。当这个步骤执行完成后,这个事务就提交完成了。“commit语句”执行的时候,会包含“com

MySQL实战45讲 15

15|答疑文章(一):日志和索引相关问题日志相关binlog(归档日志)和redolog(重做日志)配合崩溃恢复,在两阶段提交的不同瞬间,MySQL如果发生异常重启,是怎么保证数据完整性的?Q:这个图不是一个update语句的执行流程吗,怎么还会调用commit语句?A:两个“commit”的概念“commit语句”是指MySQL语法中,用于提交一个事务的命令。一般跟begin/starttransaction配对使用。而图中用到的这个“commit步骤”,指的是事务提交过程中的一个小步骤,也是最后一步。当这个步骤执行完成后,这个事务就提交完成了。“commit语句”执行的时候,会包含“com

MySQL实战45讲 10

10|MySQL为什么有时候会选错索引?使用哪个索引是由MySQL来确定的可能遇到的情况:一条本来可以执行得很快的语句,却由于MySQL选错了索引,而导致执行速度变得很慢先建一个简单的表,表里有a、b两个字段,并分别建上索引:CREATETABLE`t`(`id`int(11)NOTNULL,`a`int(11)DEFAULTNULL,`b`int(11)DEFAULTNULL,PRIMARYKEY(`id`),KEY`a`(`a`),KEY`b`(`b`))ENGINE=InnoDB;然后,我们往表t中插入10万行记录,取值按整数递增,即:(1,1,1),(2,2,2),(3,3,3)直到(

MySQL实战45讲 10

10|MySQL为什么有时候会选错索引?使用哪个索引是由MySQL来确定的可能遇到的情况:一条本来可以执行得很快的语句,却由于MySQL选错了索引,而导致执行速度变得很慢先建一个简单的表,表里有a、b两个字段,并分别建上索引:CREATETABLE`t`(`id`int(11)NOTNULL,`a`int(11)DEFAULTNULL,`b`int(11)DEFAULTNULL,PRIMARYKEY(`id`),KEY`a`(`a`),KEY`b`(`b`))ENGINE=InnoDB;然后,我们往表t中插入10万行记录,取值按整数递增,即:(1,1,1),(2,2,2),(3,3,3)直到(

MySQL实战45讲 11

11|怎么给字符串字段加索引?Q:如何在邮箱这样的字段上建立合理的索引?用户表的定义:createtableSUser(IDbigintunsignedprimarykey,emailvarchar(64),...)engine=innodb;由于要使用邮箱登录,所以业务代码中一定会出现类似于这样的语句:selectf1,f2fromSUserwhereemail='xxx';如果email这个字段上没有索引,那么这个语句就只能做全表扫描。A:前缀索引MySQL是支持前缀索引的,也就是说,可以定义字符串的一部分作为索引。默认地,如果你创建索引的语句不指定前缀长度,那么索引就会包含整个字符串。a

MySQL实战45讲 11

11|怎么给字符串字段加索引?Q:如何在邮箱这样的字段上建立合理的索引?用户表的定义:createtableSUser(IDbigintunsignedprimarykey,emailvarchar(64),...)engine=innodb;由于要使用邮箱登录,所以业务代码中一定会出现类似于这样的语句:selectf1,f2fromSUserwhereemail='xxx';如果email这个字段上没有索引,那么这个语句就只能做全表扫描。A:前缀索引MySQL是支持前缀索引的,也就是说,可以定义字符串的一部分作为索引。默认地,如果你创建索引的语句不指定前缀长度,那么索引就会包含整个字符串。a