一 数据库建立索引常用的规则如下:
1、表的主键、外键必须有索引;
2、经常与其他表进行连接的表,在连接字段上应该建立索引;
3、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
4、索引应该建在选择性高的字段上;
5、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
6、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
A、正确选择复合索引中的主列字段,一般是选择性较好的字段;
B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中? 单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;
C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;
D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;
E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;
F、如果我们创建了(area, age,
salary)的复合索引,那么其实相当于创建了(area,age,salary)、(area,age)、(area)三个索引,这被称为最佳左前缀
7、频繁进行数据操作的表,不要建立太多的索引;
8、删除无用的索引,避免对执行计划造成负面影响;
9、不是什么情况都非得建索引不可,比如性别可能就只有两个值,建索引不仅没什么优势,还会影响到更新速度,这被称为过度索引
以上是一些普遍的建立索引时的判断依据。
因为太多的索引与不充分、不正确的索引对性能都毫无益处:在表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。
另外,过多的复合索引,在有单字段索引的情况下,一般都是没有存在价值的;相反,还会降低数据增加删除时的性能,特别是对频繁更新的表来说,负面影响更大。总的来说,小型表肯定不建索引,或者数据库记录在亿条数据级以上,还是建议使用非关系型数据库。还有些特殊字段的数据库,比如BLOB,CLOB字段肯定也不适合建索引。其实这个问题更感觉偏向于做软件项目的一种经验
二 什么情况下索引会失效
1、以%开头的LIKE查询不能够用索引
2、数据类型出现隐式转换(如: name=1)
3、复合索引的情况下,查询条件不满足索引最左的原则
4、Mysql估计使用索引比全表扫描慢
5、用or分割开的条件,or前条件有索引,or后的列没有索引
5、负向查询(not , not in, not like, <>, != ,!>,!< ) 不会使用索引
6、独立的列 索引 不能是表达式的一部分(如:id+1)
7、索引值不能为null