您的位置:首页 > 博客中心 > 数据库 >

MySQL建立索引的基础规则

时间:2022-03-14 04:30

1、mysql索引(基础与规则)

索引规则:

一、 MySQL建表,字段需设置为非空,需设置字段默认值。

二、 MySQL建表,字段需NULL时,需设置字段默认值,默认值不为NULL。

三、 MySQL建表,如果字段等价于外键,应在该字段加索引。

四、 MySQL建表,不同表之间的相同属性值的字段,列类型,类型长度,是否非空,是否默认值,需保持一致,否则无法正确使用索引进行关联对比。

五、 MySQL使用时,一条SQL语句只能使用一个表的一个索引。所有的字段类型都可以索引,多列索引的属性最多15个。

六、 如果可以在多个索引中进行选择,MySQL通常使用找到最少行的索引,索引唯一值最高的索引。

七、 建立索引index(part1,part2,part3),相当于建立了index(part1),index(part1,part2)和index(part1,part2,part3)三个索引。

八、 MySQL针对like语法必须如下格式才使用索引:SELECT * FROM t1    WHERE key_col LIKE ‘ab%‘ ;

九、 SELECT COUNT(*) 语法在没有where条件的语句中执行效率没有SELECT COUNT(col_name)快,但是在有where条件的语句中执行效率要快。

十、 在where条件中多个and的条件中,必须都是一个多列索引的key_part属性而且必须包含key_part1。各自单一索引的话,只使用遍历最少行的那个索引。

十一、 在where条件中多个or的条件中,每一个条件,都必须是一个有效索引。

十二、 ORDER BY 后面的条件必须是同一索引的属性,排序顺序必须一致(比如都是升序或都是降序)。

十三、 所有GROUP BY列引用同一索引的属性,并且索引必须是按顺序保存其关键字的。

十四、 JOIN 索引,所有匹配ON和where的字段应建立合适的索引。

十五、 对智能的扫描全表使用FORCE INDEX告知MySQL,使用索引效率更高。

十六、 定期ANALYZE TABLE tbl_name为扫描的表更新关键字分布 。

十七、 定期使用慢日志检查语句,执行explain,分析可能改进的索引。

十八、 条件允许的话,设置较大的key_buffer_size和query_cache_size的值(全局参数),和sort_buffer_size的值(session变量,建议不要超过4M)。

 

首先分析项目的数据表,都会有什么样的操作,比如产品列表,会按照分类、品牌等做where,按照时间、价格等排序(order by),所以做索引,个人觉得应该是按照业务逻辑去做。

 

  • 表的主键、外键必须有索引;

  • 数据量超过300的表应该有索引;

  • 经常与其他表进行连接的表,在连接字段上应该建立索引;

  • 经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;

  • 索引应该建在选择性高的字段上;

  • 索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;

  • 复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:

    1. 正确选择复合索引中的主列字段,一般是选择性较好的字段;

    2. 复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;

    3. 如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;

    4. 如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;

    5. 如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;

  • 频繁进行数据操作的表,不要建立太多的索引;

  • 删除无用的索引,避免对执行计划造成负面影响;

  • 以上是一些普遍的建立索引时的判断依据。一言以蔽之,索引的建立必须慎重,对每个索引的必要性都应该经过仔细分析,要有建立的依据。因为太多的索引 与不充分、不正确的索引对性能都毫无益处:在表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。另外,过多的复合 索引,在有单字段索引的情况下,一般都是没有存在价值的;相反,还会降低数据增加删除时的性能,特别是对频繁更新的表来说,负面影响更大。


    本文出自 “” 博客,请务必保留此出处

    热门排行

    今日推荐

    热门手游