草庐IT

MySQL实战45讲 12

12|为什么我的MySQL会“抖”一下?一条SQL语句,正常执行的时候特别快,但是有时也不知道怎么回事,它就会变得特别慢,并且这样的场景很难复现,它不只随机,而且持续时间还很短。你的SQL语句为什么变“慢”了内存里的数据写入磁盘的过程,叫做flush。在这个flush操作执行之前,内存里的数据和磁盘里的是不一致的。当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页”。平时执行很快的更新操作,其实就是在写内存和日志,而MySQL偶尔“抖”一下的那个瞬间,可能就是在刷脏页(flush)什么情况会引发数据库的f

MySQL实战45讲 19

19|为什么我只查一行的语句,也执行这么慢?有些情况下,“查一行”,也会执行得特别慢。需要说明的是,如果MySQL数据库本身就有很大的压力,导致数据库服务器CPU占用率很高或ioutil(IO利用率)很高,这种情况下所有语句的执行都有可能变慢,不属于本章讨论范围。为了便于描述,构造一个表,基于这个表来说明问题。这个表有两个字段id和c,并且在里面插入了10万行记录。CREATETABLE`t`(`id`int(11)NOTNULL,`c`int(11)DEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDB;delimiter;;createprocedureida

MySQL实战45讲 19

19|为什么我只查一行的语句,也执行这么慢?有些情况下,“查一行”,也会执行得特别慢。需要说明的是,如果MySQL数据库本身就有很大的压力,导致数据库服务器CPU占用率很高或ioutil(IO利用率)很高,这种情况下所有语句的执行都有可能变慢,不属于本章讨论范围。为了便于描述,构造一个表,基于这个表来说明问题。这个表有两个字段id和c,并且在里面插入了10万行记录。CREATETABLE`t`(`id`int(11)NOTNULL,`c`int(11)DEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDB;delimiter;;createprocedureida

MySQL实战45讲 14

14|count(*)这么慢,我该怎么办?在开发系统的时候,你可能经常需要计算一个表的行数,比如一个交易系统的所有变更记录总数。随着系统中记录数越来越多,selectcount(*)fromt语句执行得也会越来越慢count(*)的实现方式在不同的MySQL引擎中,count(*)有不同的实现方式。MyISAM引擎把一个表的总行数存在了磁盘上,因此执行count(*)的时候会直接返回这个数,效率很高;而InnoDB引擎执行count(*)的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。这里讨论的是没有过滤条件的count(*),如果加了where条件的话,MyISAM表也是不能返回

MySQL实战45讲 14

14|count(*)这么慢,我该怎么办?在开发系统的时候,你可能经常需要计算一个表的行数,比如一个交易系统的所有变更记录总数。随着系统中记录数越来越多,selectcount(*)fromt语句执行得也会越来越慢count(*)的实现方式在不同的MySQL引擎中,count(*)有不同的实现方式。MyISAM引擎把一个表的总行数存在了磁盘上,因此执行count(*)的时候会直接返回这个数,效率很高;而InnoDB引擎执行count(*)的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。这里讨论的是没有过滤条件的count(*),如果加了where条件的话,MyISAM表也是不能返回

MySQL实战45讲 17

17|如何正确地显示随机消息?场景:从一个单词表中随机选出三个单词。表的建表语句和初始数据的命令如下,在这个表里面插入了10000行记录:CREATETABLE`words`(`id`int(11)NOTNULLAUTO_INCREMENT,`word`varchar(64)DEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDB;delimiter;;createprocedureidata()begindeclareiint;seti=0;whilei内存临时表用orderbyrand()来实现这个逻辑,随机排序取前3个。selectwordfromwordso

MySQL实战45讲 17

17|如何正确地显示随机消息?场景:从一个单词表中随机选出三个单词。表的建表语句和初始数据的命令如下,在这个表里面插入了10000行记录:CREATETABLE`words`(`id`int(11)NOTNULLAUTO_INCREMENT,`word`varchar(64)DEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDB;delimiter;;createprocedureidata()begindeclareiint;seti=0;whilei内存临时表用orderbyrand()来实现这个逻辑,随机排序取前3个。selectwordfromwordso

MySQL实战45讲 16

16|“orderby”是怎么工作的?以市民表为例,假设要查询城市是“杭州”的所有人名字,并且按照姓名排序返回前1000个人的姓名、年龄。这个表的部分定义:CREATETABLE`t`(`id`int(11)NOTNULL,`city`varchar(16)NOTNULL,`name`varchar(16)NOTNULL,`age`int(11)NOTNULL,`addr`varchar(128)DEFAULTNULL,PRIMARYKEY(`id`),KEY`city`(`city`))ENGINE=InnoDB;SQL语句可以这么写:selectcity,name,agefromtwher

MySQL实战45讲 16

16|“orderby”是怎么工作的?以市民表为例,假设要查询城市是“杭州”的所有人名字,并且按照姓名排序返回前1000个人的姓名、年龄。这个表的部分定义:CREATETABLE`t`(`id`int(11)NOTNULL,`city`varchar(16)NOTNULL,`name`varchar(16)NOTNULL,`age`int(11)NOTNULL,`addr`varchar(128)DEFAULTNULL,PRIMARYKEY(`id`),KEY`city`(`city`))ENGINE=InnoDB;SQL语句可以这么写:selectcity,name,agefromtwher

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