组合索引
常见误区:
表上建多个索引,就是组合索引(不是);
组合索引创建时应该把整数字段放前面(要根据查询情况而定);
组合索引建好后,只要使用包含的字段,就会走索引(要看使用顺序);
注意事项:
在where条件中,组合必须是从前往后顺序写(索引顺序)才会生效,条件顺序可以前后颠倒(MySQL有优化);
组合索引在设计联合、分组、排序等复杂SQL时会变得很复杂,所以需要先explain确认再写SQL;
在查询中只要构造上能使用索引的话,查询速度比不使用索引要快的多(哪怕有些无效条件),所以大表的查询要养成先看表结构的习惯;
多表关联
常见误区:
关联时小表在前面,大表在后面查询会更快(MySQL有优化);
关联的字段2个表都要有索引(MySQL有优化,可以使用Explain确认);
只要有索引的字段关联就会快(还要看数据,看数据,看数据);
注意事项:
多表关联时,关联字段必须要确认是否可用索引;
有些优化细节,未必会适用于所有版本或者所有数据,所以编写复杂SQL时还是要使用explain确认是走索引,尤其是在线上数据环境下;
针对不确定的数据,很有必要确认数据,查看是否有重复数据;
针对无故执行太慢的查询,有必要确认一下关联字段的数据,有时候没准就是大量重复数据造成的;
笛卡尔积
笛卡尔积也叫笛卡尔乘积,是指在数学中两个集合X和Y的笛卡尓积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员。
笛卡尔积可以理解为2个数据集合的遍历结合,如果A表和B表进行关联,但没有设定任何关联条件,即可产生一个笛卡尔积,例如select * from a, b
但实际情况中很多人关联时不注意关联字段的数据唯一性,也是很容易产生笛卡尔积,所以SQL关联时,一定要注意要对关联字段的数据性质和数据分布情况有一个很准确的理解;
并非所有的笛卡尔积都是不好的,有时候也可以利用笛卡尔积完成一些很有用的事情;
常见索引不生效的情况
组合索引的使用顺序应该是从左到右的,中间不能空缺,例如:索引字段依次为a, b, c 那么条件中a要排在b、c的前面否则是不生效的,出现a,c则生效的部分只有字段a;
like中%位于字符串前面,如:like ‘%xxx’;
对符号左侧进行运算或函数,如:where a+1>7;
使用not in 和<>操作,如:where a<>4,如果确实需要,可以使用a>4 or a<4代替,
如果有过多的or,也可能会导致索引不生效,例如where a=10 or a=20 or a=30 or a =40,此时可以用in或者union all代替;
有关null值的查询,如:where a is null,所以应尽量给自动设置默认值;
数据类型不一致,如,a字段类型为int,但查询时写成where a = ‘123’;
索引类型是Hash索引,但查询中使用了范围查找;
MySQL估计使用全表扫描比使用索引更快,多数是数据分布等原因;