一、索引基础知识
(一)辅助索引/二级索引
叶子节点除了包含键值以外,每个叶子节点中的索引行中还包含了一个书签( bookmark) (每个索引一颗B+树,不包含行记录的全部数据)
(二) 回表
通过辅助索引获得主键,然后再通过主键索引(聚集索引)来找到一个完整的行记录。
(三)联合索引/复合索引
将表上的多个列组合起来进行索引我们称之为联合索引或者复合索引
(四) 覆盖索引
从辅助索引中就可以得到查询的记录,而不需要查询聚集索引中的记录
二、高性能的索引创建策略
1、一个索引就是一个B+树,索引让我们的查询可以快速定位和扫描到我们需要的数据记录上,加快查询的速度。
2、一个select查询语句在执行过程中一般最多能使用一个二级索引,即使在where条件中用了多个二级索引。
(一)索引列的类型尽量小
索引的类型比较小处理起来会比较快。
(二)索引列的选择
索引的选择性/离散性:不重复的索引值和数据表的记录总数(N)的比值(范围1/N到1) 越高则查询效率越高。
(三)前缀索引
针对blob、text、很长的varchar字段,mysql不支持索引他们的全部长度,需建立前缀索引。 语法:Alter table tableName add key/index (column(X)) 前缀索引的选择(X): 缺点:无法应用于order by 和 group by,也无法做覆盖索引。
(四)后缀索引
mysql不支持后缀索引。 可以通过在表中添加一个新列,用于保存要被建立后缀索引的字段倒排值,然后建立前缀索引。 场景:查询邮箱后缀。
(五)只为搜索、排序或分组的列创建索引
建立索引在插入数据时会耗费大量资源,因此在不经常使用查询的字段无需建立索引。
(六)多列索引
将选择性最高的列放到索引最前列 根据那些运行频率最高的查询来调整索引列的顺序 优化性能时,需要使用相同的列但顺序不同的索引来满足不同类型的查询需求。
总结:
对于一个查询而言,三星索引可能是其最好的索引。 满足的条件如下: 索引将相关的记录放到一起则获得一星 如果索引中的数据顺序和查找中的排列顺序一致则获得二星(排序星) 如果索引中的列包含了查询中需要的全部列则获得三星(宽索引星)