1、什么表用索引
小表不用索引,基数大的列用B-Tree索引,基数小的列用位图索引。
2、索引的目的
- 提高检索速率;
- 创建唯一性索引,保证数据库的每一行数据唯一性;
- 加快表与表的连接;
- 分组和排序子句数据检索时,减少分组排序时间;
3、索引的负面影响
- 创建和维护索引耗时,这个时间随着数据的增加而增加;
- 索引要占用物理空间;
- 对表增删改的时候,索引要动态维护,这样降低了数据的维护速度;
4、什么情况下适合建立索引
- Where后面频繁出现的字段;
- 频繁使用需要排序的字段;
- 列上有很多空值,但是总需要非空记录的;
5、什么情况下不适合创建索引
- 查询中很少涉及的列,或重复值多的列;
- 特殊的数据类型,如text等;
6、设么情况下索引失效
- 最佳左前缀原则——如果索引了多列,要遵守最左前缀原则。指的是查询要从索引的最左前列开始并且不跳过索引中的列;
- 不在索引列上做任何操作(计算,函数,(自动或者手动)类型装换),会导致索引失效而导致全表扫描;
- mysql使用不等于(!=或者<>)的时候,无法使用索引,会导致索引失效;
- mysql中使用is not null 或者 is null会导致无法使用索引;
- mysql中like查询是以%开头,索引会失效变成全表扫描,覆盖索引;
- mysql中,字符串不加单引号索引会失效。正确写法:select * from t_user where username =‘tom’;
- mysql中,如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)。要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引;
在最左匹配原则中,有如下说明:
最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式】