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

  • 对于 InnoDB 引擎 , 若辅助索引能够覆盖查询 , 则无需访问主索引 。
  • 索引的优点
    • 大大减少了服务器需要扫描的数据行数 。
    • 帮助服务器避免进行排序和分组 , 以及避免创建临时表(B+Tree 索引是有序的 , 可以用于 ORDER BY 和 GROUP BY 操作 。 临时表主要是在排序和分组过程中创建 , 不需要排序和分组 , 也就不需要创建临时表) 。
    • 将随机 I/O 变为顺序 I/O(B+Tree 索引是有序的 , 会将相邻的数据都存储在一起) 。
    索引的使用条件
    • 对于非常小的表、大部分情况下简单的全表扫描比建立索引更高效;
    • 对于中到大型的表 , 索引就非常有效;
    • 但是对于特大型的表 , 建立和维护索引的代价将会随之增长 。 这种情况下 , 需要用到一种技术可以直接区分出需要查询的一组数据 , 而不是一条记录一条记录地匹配 , 例如可以使用分区技术 。
    为什么对于非常小的表 , 大部分情况下简单的全表扫描比建立索引更高效?
    如果一个表比较小 , 那么显然直接遍历表比走索引要快(因为需要回表) 。
    注:首先 , 要注意这个答案隐含的条件是查询的数据不是索引的构成部分 , 否也不需要回表操作 。 其次 , 查询条件也不是主键 , 否则可以直接从聚簇索引中拿到数据 。
    查询性能优化使用 explain 分析 select 查询语句explain 用来分析 SELECT 查询语句 , 开发人员可以通过分析 Explain 结果来优化查询语句 。
    select_type常用的有 SIMPLE 简单查询 , UNION 联合查询 , SUBQUERY 子查询等 。
    table要查询的表
    possible_keysThe possible indexes to choose
    可选择的索引
    keyThe index actually chosen
    实际使用的索引
    rowsEstimate of rows to be examined
    扫描的行数
    type索引查询类型 , 经常用到的索引查询类型:
    const:使用主键或者唯一索引进行查询的时候只有一行匹配 ref:使用非唯一索引 range:使用主键、单个字段的辅助索引、多个字段的辅助索引的最后一个字段进行范围查询 index:和all的区别是扫描的是索引树 all:扫描全表:
    system触发条件:表只有一行 , 这是一个 const type 的特殊情况
    const触发条件:在使用主键或者唯一索引进行查询的时候只有一行匹配 。
    SELECT * FROM tbl_name WHERE primary_key=1;SELECT * FROM tbl_nameWHERE primary_key_part1=1 AND primary_key_part2=2;
    打工四年总结的数据库知识点文章插图
    eq_ref触发条件:在进行联接查询的 , 使用主键或者唯一索引并且只匹配到一行记录的时候
    SELECT * FROM ref_table,other_tableWHERE ref_table.key_column=other_table.column;SELECT * FROM ref_table,other_tableWHERE ref_table.key_column_part1=other_table.columnAND ref_table.key_column_part2=1;ref触发条件:使用非唯一索引
    SELECT * FROM ref_table WHERE key_column=expr;SELECT * FROM ref_table,other_tableWHERE ref_table.key_column=other_table.column;SELECT * FROM ref_table,other_tableWHERE ref_table.key_column_part1=other_table.columnAND ref_table.key_column_part2=1;
    打工四年总结的数据库知识点文章插图
    range触发条件:只有在使用主键、单个字段的辅助索引、多个字段的辅助索引的最后一个字段进行范围查询才是 range
    SELECT * FROM tbl_nameWHERE key_column = 10;SELECT * FROM tbl_nameWHERE key_column BETWEEN 10 and 20;SELECT * FROM tbl_nameWHERE key_column IN (10,20,30);SELECT * FROM tbl_nameWHERE key_part1 = 10 AND key_part2 IN (10,20,30);