1.对应重复率非常高的字段不要建索引,如state,type等
2.尽量不要使用复合索引,如果两个字段重复率都不高,两个字段分别见索引
3.如果确实需要复合索引,重复率低的放前面,如(orde_id,seq)订单号和序列
4.一般情况外键必须建立索引
5.能建唯一索引的必须建唯一索引,提升性能
6.不要设计过多的索引,这样会影响查询效率
范围查询索引失效,只针对二级索引(除了主键,其他索引都是二级索引)
(1)、如果走二级索引查询,步骤就是:二级索引–>主键索引–>数据,这就是回表查询(mysql索引中关联的主键,而不是数据,所以二级索引查询会有一个回表的操作)。
(2)、硬盘随机I/O的性能远低于顺序I/O。
1、!= 和 <>失效问题
2、其他范围查询失效问题
注意,放弃索引走全表查询需要满足以下几点:
1、二级索引
2、范围查询
3、查询数量超过了总数据的某个百分比
4、并且查询字段不止id和索引还包含了其他字段(select后面字段不仅仅为id和where后端索引字段)
强制索引 select * from 表名 force index(索引名) where …
忽略索引 select * from 表名 ignore index(索引名) where …
2、左前缀原则
3、函数导致索引失效
user
WHERE DATE(create_time) = ‘2020-09-03’;4、字段类型不一致索引失效
user
WHERE height= 175;5、运算符导致索引失效
如果你对列进行了(+,-,*,/,!), 那么都将不会走索引。
SELECT * FROM user
WHERE age - 1 = 20;
6、or引起索引失效
例:(counter1 和 counter2是索引,counter5不是索引字段)
7、模糊查询导致索引失效
user
WHERE name
LIKE ‘%冰’;8、IN、NOT IN、 EXISTS、NOT EXISTS导致索引失效
9、IS NULL,IS NOT NULL索引失效问题