打工四年总结的数据库知识点( 四 )

  • 可以指定多个列作为索引列 , 多个索引列共同组成键 。
  • 适用于全键值、键值范围和键前缀查找 , 其中键前缀查找只适用于最左前缀查找 。 如果不是按照索引列的顺序进行查找 , 则无法使用索引 。
  • InnoDB 的 B+Tree 索引分为主索引和辅助索引 。 主索引的叶子节点 data 域记录着完整的数据记录 , 这种索引方式被称为聚簇索引 。 因为无法把数据行存放在两个不同的地方 , 所以一个表只能有一个聚簇索引 。
    打工四年总结的数据库知识点文章插图
    辅助索引的叶子节点的 data 域记录着主键的值 , 因此在使用辅助索引进行查找时 , 需要先查找到主键值 , 然后再到主索引中进行查找 , 这个过程也被称作回表 。
    打工四年总结的数据库知识点文章插图
    哈希索引哈希索引能以 O(1) 时间进行查找 , 但是失去了有序性:
    • 无法用于排序与分组;
    • 只支持精确查找 , 无法用于部分查找和范围查找 。
    InnoDB 存储引擎有一个特殊的功能叫“自适应哈希索引” , 当某个索引值被使用的非常频繁时 , 会在 B+Tree 索引之上再创建一个哈希索引 , 这样就让 B+Tree 索引具有哈希索引的一些优点 , 比如快速的哈希查找 。
    全文索引MyISAM 存储引擎支持全文索引 , 用于查找文本中的关键词 , 而不是直接比较是否相等 。
    查找条件使用 MATCH AGAINST , 而不是普通的 WHERE 。
    全文索引使用倒排索引实现 , 它记录着关键词到其所在文档的映射 。
    InnoDB 存储引擎在 MySQL 5.6.4 版本中也开始支持全文索引 。
    空间数据索引MyISAM 存储引擎支持空间数据索引(R-Tree) , 可以用于地理数据存储 。 空间数据索引会从所有维度来索引数据 , 可以有效地使用任意维度来进行组合查询 。
    必须使用 GIS 相关的函数来维护数据 。
    索引优化独立的列在进行查询时 , 索引列不能是表达式的一部分 , 也不能是函数的参数 , 否则无法使用索引 。
    例如下面的查询不能使用 actor_id 列的索引:
    SELECT actor_id FROM sakila.actor WHERE actor_id + 1 = 5;多列索引在需要使用多个列作为条件进行查询时 , 使用多列索引比使用多个单列索引性能更好 。 例如下面的语句中 , 最好把 actor_id 和 film_id 设置为多列索引 。
    SELECT film_id, actor_ id FROM sakila.film_actorWHERE actor_id = 1 AND film_id = 1;索引列的顺序让选择性最强的索引列放在前面 。
    索引的选择性是指:不重复的索引值和记录总数的比值 。 最大值为 1 , 此时每个记录都有唯一的索引与其对应 。 选择性越高 , 每个记录的区分度越高 , 查询效率也越高 。
    例如下面显示的结果中 customer_id 的选择性比 staff_id 更高 , 因此最好把 customer_id 列放在多列索引的前面 。
    SELECT COUNT(DISTINCT staff_id)/COUNT(*) AS staff_id_selectivity,COUNT(DISTINCT customer_id)/COUNT(*) AS customer_id_selectivity,COUNT(*)FROM payment;staff_id_selectivity: 0.0001customer_id_selectivity: 0.0373COUNT(*): 16049前缀索引对于 BLOB、TEXT 和 VARCHAR 类型的列 , 必须使用前缀索引 , 只索引开始的部分字符 。
    前缀长度的选取需要根据索引选择性来确定 。
    覆盖索引索引包含所有需要查询的字段的值 。
    具有以下优点: