zoukankan      html  css  js  c++  java
  • mysql索引

     

    为什么使用索引

    项目中我们经常要使用索引,因为很多场景都要求有比较好的查询性能。

    l 优势

    类似于书的目录,可以提高数据检索的效率,降低数据库的IO成本。

    通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗。

    被索引的列会自动进行排序,包括单列索引和组合索引,只是组合索引的排序要复杂一些。

    如果按照索引列的顺序进行排序对应order by语句来说,效率就会提高很多。

    l 劣势

    索引会占据磁盘空间

    * 索引会提高查询效率,但是会降低更新表的效率。比如每次对表进行增删改操作,MySQL不仅要保存数据,还有保存或者更新对应的索引文件。

    使用

    ALTER TABLE xxx_table ADD INDEX 自定义索引名字('列1','列2','列3')

    我们一般会建立组合索引,索引字段从左到右是有顺序的。

    当我们执行查询语句时,WHERE条件从左到右要和索引的顺序匹配(如果顺序不匹配,MYSQL语法优化器会帮我们调整顺序)

    1. WHERE条件中如果包含索引的最左边一个列名(如这里的'列1')条件,则可以极大程度地提高查询性能

    2. WHERE条件中如果只包含索引的非最左边一个列名(如这里的'列2','列3'),则需要遍历整个自定义索引数

    3. WHERE条件中如果不包含索引列名,则无法使用索引

    索引使用建议

    1.最好用数字做索引,主键最好是自增id而非uuid

    2.每次查询只能用一个索引,因此建议使用组合索引

    3.查询的字段如果辅助索引树都包含,可以省去第二次搜索主键索引树的操作

    哪些情况需要创建索引

    1. 主键自动建立唯一索引
    2. 频繁作为查询条件的字段应该创建索引
    3. 多表关联查询中,关联字段应该创建索引
    4. 查询中排序的字段,应该创建索引
    5. 查询中统计或者分组字段,应该创建索引 

    哪些情况不需要创建索引

    1. 表记录太少
    2. 经常进行增删改操作的表
    3. 频繁更新的字段
    4. where条件里使用频率不高的字段

    注意事项

    like语句   ——   like '%aaa%'或者like '%aaa'不会使用索引而like "aaa%"可以使用索引

    is null、is not null   ——   会不使用索引

     

    索引失效与优化

    例如建议索引如下:

    1、全值匹配我最爱

    2、最佳左前缀法则(带头索引不能死,中间索引不能断)

    如果索引了多个列,要遵守最佳左前缀法则。指的是查询从索引的最左前列开始 并且 不跳过索引中的列。 正确的示例参考上图。

    错误的示例: 带头索引死:

    中间索引断(带头索引生效,其他索引失效):

     

    3、不要在索引上做任何操作(计算、函数、自动/手动类型转换),不然会导致索引失效而转向全表扫描

    4mysql存储引擎不能继续使用索引中范围条件(bettween<>in)


    5
    、尽量使用覆盖索引(只查询索引的列(索引列和查询列一致)),减少select *等)右边的列

    6、索引字段上使用(!= 或者 < >)判断时,会导致索引失效而转向全表扫描

    7、索引字段上使用 is null / is not null 判断时,会导致索引失效而转向全表扫描

    8、索引字段使用like以通配符开头(‘%字符串)时,会导致索引失效而转向全表扫描


    由结果可知,like以通配符结束相当于范围查找,索引不会失效。与范围条件(bettween、<、>、in等)不同的 是:不会导致右边的索引失效。 

    问题:解决like ‘%字符串%’时,索引失效问题的方法? 使用覆盖索引可以解决。

     

    9、索引字段是字符串,但查询时不加单引号,会导致索引失效而转向全表扫描

    10、索引字段使用 or 时,会导致索引失效而转向全表扫描 

     

     

  • 相关阅读:
    CSS学习笔记07 盒子模型
    [Android]AndFix使用说明
    [Android]自定义控件LoadMoreRecyclerView
    [算法]Plus One
    [Android]android Service后台防杀
    [Android]android studio预览视图时报错
    [算法]删除无序单链表中值重复出现的节点
    [算法] 将单链表的每K个节点之间逆序
    [Android]热修复框架AndFix测试说明
    [算法]单链表的选择排序
  • 原文地址:https://www.cnblogs.com/amiezhang/p/10029901.html
Copyright © 2011-2022 走看看