顾名思义慢查询就是查询的语句反应时间超过阀值的时间,设置慢查询的全局配置就需要在配置文件my.cnf slow_query_log=1: #是否开启慢查询日志,1表示开启,0表示关闭,(默认为关闭) slow_query_time=1 # 设置慢查询的阀值,单位为(s) slow_query_log_file=/tmp/mysql_slow.log # 慢查询的相关信息log的路径
B+树
特点
1. B+树的层级少:相较于B树B+每个非叶子节点存储的关键字数更多,树的层级更少所以查询数据更快; 2. B+树查询速度更稳定:B+所有关键字数据地址都存在叶子节点上,所以每次查找的次数都相同所以查询速度要比B树更稳定; 3. B+树天然具备排序功能:B+树所有的叶子节点数据构成了一个有序链表,在查询大小区间的数据时候更方便,数据紧密性很高,缓存的命中率也会比B树高。 4. B+树全节点遍历更快:B+树遍历整棵树只需要遍历所有的叶子节点即可,,而不需要像B树一样需要对每一层进行遍历,这有利于数据库做全表扫描。
常见mysql中B+树的层级(3-4层)why?
InnoDB存储引擎最小的存储单元是(页), 每一页的大小是16k(即16384个字节),每一行数据大概就是1k左右,那么一页就可以存16条数据 那么在InnoDb中2层的高度的B+树能存多少条数据,我们来分析一下: 在InnoDB中每个指针为6个字节,一个键值4-8个字节(如:Id为主键 -> bigInt类型是8字节)那么加起来就是14个字节, 那么一页能存16384/14 =1170个指针, 所以2层的B+树能存1170*16=18720条数据 在InnoDB在B+树高度一般为3层所以1170 * 1170 * 16= 21902400 条数据,能存千万级别的数据
创建一个表:id,name,age,gender id为主键,name为普通索引
回表(二次查询)
select * from table where name=zhangsan --先根据name查询name的B+树,找到对应的id,后根据id到id的B+中查到所有的数据,这个过程叫做回表
索引覆盖
select id,name from table where name=zhangsan --先根据name到name的B+树上找到紫叶节点,能够找到name,id的值,就不需要回表了,这个过程叫做索引覆盖
最左前缀
id,name,age,gender id为主键,name,age是组合索引
select * from table where name=zhangsan and age=1 (可以) select * from table where name=zhangsan (可以) select * from table where age=1 (不可以) select * from table where age=1 and name=zhangsan (可以)
索引下推
id,name,age,gender id为主键,name,age是组合索引
select * from table where name=zhangsan and age=1 --没有索引下推之前:先根据name去存储引擎中拉取数据,然后在server层中对age的数据过滤 --有了索引下推之后:直接根据name和age的值对存储引擎拉取数据,不需要到server层去数据过滤
mysql> explain select * from servers; +----+-------------+---------+------+---------------+------+---------+------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+---------+------+---------------+------+---------+------+------+-------+ | 1 | SIMPLE | servers | ALL | NULL | NULL | NULL | NULL | 1 | NULL | +----+-------------+---------+------+---------------+------+---------+------+------+-------+ row in set (0.03 sec)
expalin使用详情