执行流程
客户端,连接器,查询缓存(判断缓存是否命中,命中直接返回结果),分析器,优化器,执行器,引擎,查询结果。
我们平时sql调优就是在分析器和优化器阶段进行的
排除缓存干扰(5.8之后不存在这个问题)
- 如果数据库支持缓存并且开启了缓存,缓存就以key/value的形式保存在内存中
- 缓存失效:只要对表进行更新,这个表所有的缓存就会被清空
- 使用sql_no_cache,避开缓存,得到真实的查询时间
select sql_no_cache name from user;
Explain
- 检查key是否用到索引,
- 是否充分用到索引,key_len长度,算法:50*3 + 1 +2
字符类型:varchar + 2 char + 0
字符集:UTF-8 + 3
本身长度:加入设置的50
是否为null null + 1, not nul + 0
索引
- mysql支持两种索引类型:hash和BTree
- 索引又分为 普通索引,唯一索引,主键索引(唯一索引的一种,只是主键索引不能为空,唯一索引可以为空),全文索引。
另外也可以分为聚簇索引和非聚簇索引,聚簇索引的叶子节点就是数据节点,保存了索引和数据,非聚簇索引的叶子节点还是索引节点,只不过有一个指向数据的指针。 - 索引的目的就是对数据进行有规律地管理,创建表的时候设置的主键就是索引(也叫聚簇索引),如果没有也可以设置唯一索引,如果都没有创建,mysql会自己创建一个rowid的字段,用它来组织这棵树。
二级索引(辅助索引)
聚簇索引只会加快主键查询效率,对于其他字段查询会进行全表扫描,所以需要创建索引,对于索引的选择,对于我们查询频率较高和数据类型多的字段进行创建索引(像性别这种字段不适合创建索引,因为只有两种类型,即便走索引也会查很多)
1.组合索引:从前往后一次生效,对于中间索引失效,它后面的索引也会失效,所以在擦行间索引的时候,尽量遵循最左前对匹配原则
- 索引覆盖(Extra字段为Using index):在创建组合索引以后,尽量只查询我们创建索引的这些列,这样通过索引遍历就可以直接拿到数据,不需要回表查询操作,减少磁盘IO。
- 索引下推:是mysql5.6及以后对非主键索引做的优化
mysq> select * from tuser where name like '张 %' and age=10 and ismale=1;
如上面sql只能匹配姓名张的数据,然后逐一回表查询,索引下推就是在索引遍历中,对索引字段先进行,过滤掉不满足的数据,然后再做回表,减少回表次数。