索引是一种特殊的文件, 它们包含着对数据表里所有记录的引用指针. 更通俗的说, 数据库索引好比是一本书前面的目录, 能加快数据库的查询速度.
联合索引
又名复合索引, 由两个或多个列的索引. 它规定了 mysql 从左到右地使用索引字段, 对字段的顺序有一定要求. 一个查询可以只使用索引中的一部分, 更准确地说是最左侧部分 (最左优先). 如索引是 key index (a,b,c). 可以支持 a | a,b| a,b,c 3 种组合进行查找, 但不支持 b,c 进行查找 . 当最左侧字段是常量引用时, 索引就十分有效.
- CREATE TABLE test(a INT, b INT, c INT, KEY(a, b, c));
- 1
前缀索引
对于列的值较长, 比如 BLOB,TEXT,VARCHAR, 就必须建立前缀索引, 即将值的前一部分作为索引. 这样既可以节约空间, 又可以提高查询效率. 但无法使用前缀索引做 ORDER BY 和 GROUP BY, 也无法使用前缀索引做覆盖扫描.
- # 语法
- ALTER TABLE table_name ADD KEY(column_name(prefix_length));
- # 示例
- ALTER TABLE city ADD KEY(cityname(7))
- 1
- 2
- 3
- 4
覆盖索引
跟联合索引有点类似, 就是在查询 t 的时候只用去读取索引而取得数据, 无需进行二次查询相关表. 这样的索引的叶子节点上面也包含了他们索引的数据.
判断标准: 使用 explain, 可以通过输出的 extra 列来判断, 对于一个索引覆盖查询, 显示为 using index,MySQL 查询优化器在执行查询前会决定是否有索引覆盖查询.
来源: http://www.bubuko.com/infodetail-2733158.html