草庐IT

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

MySQL实战45讲 9

09|普通索引和唯一索引,应该怎么选择?每个人都有一个唯一的身份证号,而且业务代码已经保证了不会写入两个重复的身份证号。如果市民系统需要按照身份证号查姓名,就会执行类似这样的SQL语句:selectnamefromCUserwhereid_card='xxxxxxxyyyyyyzzzzz';由于身份证号字段比较大,不建议你把身份证号当做主键,那么现在有两个选择,要么给id_card字段创建唯一索引,要么创建一个普通索引。Q:从性能的角度考虑,选择唯一索引还是普通索引呢?选择的依据是什么呢?A:ans用k来表示上面的身份证号,假设字段k上的值都不重复。查询过程假设,执行查询的语句是selecti

MySQL实战45讲 9

09|普通索引和唯一索引,应该怎么选择?每个人都有一个唯一的身份证号,而且业务代码已经保证了不会写入两个重复的身份证号。如果市民系统需要按照身份证号查姓名,就会执行类似这样的SQL语句:selectnamefromCUserwhereid_card='xxxxxxxyyyyyyzzzzz';由于身份证号字段比较大,不建议你把身份证号当做主键,那么现在有两个选择,要么给id_card字段创建唯一索引,要么创建一个普通索引。Q:从性能的角度考虑,选择唯一索引还是普通索引呢?选择的依据是什么呢?A:ans用k来表示上面的身份证号,假设字段k上的值都不重复。查询过程假设,执行查询的语句是selecti

MySQL实战45讲 4,5

04|深入浅出索引(上)索引的出现其实就是为了提高数据查询的效率,就像书的目录一样索引的常见模型哈希表、有序数组和搜索树哈希表User2和User4根据身份证号算出来的值都是N,但没关系,后面还跟了一个链表。需要注意的是,图中四个ID_card_nhash出来的值并不是递增的,这样做的好处是增加新的User时速度会很快,只需要往后追加。但缺点是,因为不是有序的,所以哈希索引做区间查询的速度是很慢的,需要全部扫描一遍。所以,哈希表这种结构适用于只有等值查询的场景,比如Memcached及其他一些NoSQL引擎。有序数组有序数组在等值查询和范围查询场景中的性能就都非常优秀数组就是按照身份证号递增的

MySQL实战45讲 4,5

04|深入浅出索引(上)索引的出现其实就是为了提高数据查询的效率,就像书的目录一样索引的常见模型哈希表、有序数组和搜索树哈希表User2和User4根据身份证号算出来的值都是N,但没关系,后面还跟了一个链表。需要注意的是,图中四个ID_card_nhash出来的值并不是递增的,这样做的好处是增加新的User时速度会很快,只需要往后追加。但缺点是,因为不是有序的,所以哈希索引做区间查询的速度是很慢的,需要全部扫描一遍。所以,哈希表这种结构适用于只有等值查询的场景,比如Memcached及其他一些NoSQL引擎。有序数组有序数组在等值查询和范围查询场景中的性能就都非常优秀数组就是按照身份证号递增的

MySQL实战45讲 6,7,8

06|全局锁和表锁:给表加个字段怎么有这么多阻碍?Connection连接与Session会话通俗来讲,会话(Session)是通信双⽅从开始通信到通信结束期间的⼀个上下文(Context)。这个上下文是⼀段位于服务器端的内存:记录了本次连接的客户端机器、通过哪个应用程序、哪个用户登录等信息。连接是物理上的客户端同服务器的通信链路根据加锁的范围,MySQL里面的锁大致可以分成全局锁、表级锁和行锁三类。全局锁全局锁就是对整个数据库实例加锁Flushtableswithreadlock(FTWRL)当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(

MySQL实战45讲 6,7,8

06|全局锁和表锁:给表加个字段怎么有这么多阻碍?Connection连接与Session会话通俗来讲,会话(Session)是通信双⽅从开始通信到通信结束期间的⼀个上下文(Context)。这个上下文是⼀段位于服务器端的内存:记录了本次连接的客户端机器、通过哪个应用程序、哪个用户登录等信息。连接是物理上的客户端同服务器的通信链路根据加锁的范围,MySQL里面的锁大致可以分成全局锁、表级锁和行锁三类。全局锁全局锁就是对整个数据库实例加锁Flushtableswithreadlock(FTWRL)当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(