1.首先要排除缓存干扰,mysql8.0以前sql是会缓存的,可以加SQL NoCache去排除
2.可以开启慢sql日志定位到慢sql,然后explain查看执行计划,重点关注字段
rows:为了查找数据而读取的行数;该数据可能不准,因为mysql采用采样统计,会统计n个数据页,然后取一个均值,再乘以索引页数,可以用analyze table tablename来重新统计索引信息
possible_keys : 可能使用的索引;
key : 真实使用的索引
key_len : MySQL中使用索引字节长度
3.索引的使用:索引有聚集索引和辅助索引
聚集索引:即为主键索引,特点是叶子结点上存储了数据,不需要回表操作,效率较高
辅助索引:(普通索引)是非主键索引,叶子结点存储了数据的主键索引,需要回表操作
覆盖索引:如果一个索引包含(或覆盖)所有需要查询的字段的值,称为‘覆盖索引’。即只需扫描索引而无须回表,将单列索引升级为联合索引可以提高效率避免回表操作,最左匹配原则:对于复合索引,如果最左边的索引没有执行,后面的索引也无法执行
changebuff:对于修改操作,如果在内存里就直接更新,如果不在,在保证数据一致性的前提下,innodb会将这些更新操作存放在changebuff里面,这样就不需要从磁盘里读取该数据,当需要读取数据的时候回触发merge操作,即将changebuff里与该数据有关的操作执行,changebuff是持久化的数据,在内存中有拷贝,在后台mysql会定时merge。使用场景:对于主键索引,因为要满足唯一性约束,所以要把数据从磁盘读入内存,也就不需要再去保存修改操作了,所以只适用于普通索引。尤其对于写多读少的场景非常适合,最常见的账单、日志类的的系统