5、mysql索引简介

1、实现方式

MySQL主要提供2种方式的索引:B-Tree索引,Hash索引
  1. B树索引具有范围查找和前缀查找的能力,对于有N节点的B树,检索一条记录的复杂度为O(LogN)。相当于二分查找。
  2. 哈希索引只能做等于查找,但是无论多大的Hash表,查找复杂度都是O(1)。
  显然,如果值的差异性大,并且以等值查找(=、 <、>、in)为主,Hash索引是更高效的选择,它有O(1)的查找复杂度。
  如果值的差异性相对较差,并且以范围查找为主,B树是更好的选择,它支持范围查找。
 

2、索引有效性

'Server version5.6.21
  1. where子句的查询条件里有!=或<>或not in条件,MySQL将无法使用索引;
  2.  
    where子句的查询条件中使用了函数,MySQL将无法使用索引;
  3. 前导模糊查询用不到索引(like/regexp '%xx' 或 '%xx%')
  4. 条件中有or不会使用任何索引 除非or前后条件的字断都有索引
  5. 字符串列要使用索引一定要在条件中将数据用引号引用起来
  6. (where A=a order by B)不使用AB联合索引只使用A索引
  7. SELECT * FROM T WHERE FUN(Y) = XXX。这个时候索引也不会被用到,因为你要查询的列中所有的行都需要被计算一遍,因此,如果要让这种sql语句的效率提高的话,在这个表上建立一个基于函数的索引,比如CREATE INDEX IDX FUNT ON T(FUN(Y));这种方式,等于Oracle会建立一个存储所有函数计算结果的值,再进行查询的时候就不需要进行计算了,因为很多函数存在不同返回值,因此必须标明这个函数是有固定返回值的。
  8. select * 或者 count(*) 这种慢查询一般都用不到索引
  9. 在JOIN操作中(需要从多个数据表提取数据时),MYSQL只有在主键和外键的数据类型相同时才能使用索引,否则即使建立了索引也不会使用
  10. mysql自己估计全表扫描要比使用索引快,则不实用索引
 

3、使用建议:

  1. 操作涉及多个单列索引 会使用一个重复度最低的索引而且要维护所有索引 此时建议只建立一个重复度最低的索引(如name和age)
  2. 联合索引维护成本大占用空间大 如果联合索引其中一个column重复度非常低 建议使用重复度低的单列索引(如name和age)
  3. 两个字断是多对多的关系 建议使用联合索引(如student_id和teacher_id)
  4. 可能为null的列不能创建索引 null无法比较,无法确定索引树的节点(解决办法:1、可以把 null转为特定值,2、放在有不为null列的联合索引中)
  5. 索引不适合键值较少的列(重复数据较多的列)
  6. 创建联合索引区分度高的列在前

猜你喜欢

转载自www.cnblogs.com/cbil/p/10014033.html