目录
一、关联查询,主表的选择(Mysql优化器会进行优化)
备注:主表进行全表扫描,然后通过主键再找到其他表的数据,所以其他表会走主键索引(这里是用主键做关联查询)
1、where条件没有命中索引(可针对主表建对应的索引)
1.1、A,B表数据量相同(不走索引)
如果主键一样,则第一个表进行全表扫描,第二个表走主键索引
如果有联合主键,则有联合主键的表进行全表扫描,另一个表走主键索引
1.2、A,B表数据量不相同(不走索引)
如果主键一样,则数据量少的表进行全表扫描,数据量多的表走主键索引
如果有联合主键,也是数据量少的表进行全表扫描,数据量多的表走主键索引
2、where条件命中索引
如果where条件中有命中索引,则把索引所属的表当成主表,另一个表用主键索引【主表是全表扫描的,可以通过索引,让主表走索引避免全表扫描】
二、辨识度低的字段不适合建索引
辨识度低的字段,例如性别,只有男、女、其他,查询 性别=男 的时候,能够匹配到的数据量太大,数据库优化器认为全表扫描会效率高,所以不会走索引
三、联合主键索引
表中A和B为联合主键(A在前,B在后),当where条件中,只用一个主键字段做条件查询时,会遵循最左匹配原则【类似于like ‘xxx%’,%不在前面才会走索引,扫描B+树,定位到大概的范围进行搜索】
例如:
SELECT * FROM table WHERE A = xxx; //会走主键,遵循最左匹配原则
SELECT * FROM table WHERE B = xxx; //不会走主键,因为需要先匹配到前面A,才能知道B的位置,可自行百度B+树是怎么找数据的
四、order by排序
order by排序的字段需要是where中命中索引的字段,才能利用索引的有序性,不用再进行外部排序(order by没有利用索引的有序性,会把数据放到内存中进行排序处理,如果内存不够,则有一部分会先放在磁盘上再排序&