博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql优化之索引优化
阅读量:803 次
发布时间:2019-03-25

本文共 1635 字,大约阅读时间需要 5 分钟。

mysql优化之索引优化

** 索引的作用一个是查找,一个是排序。

排序?

单索引 -> 有序

联合索引 (a,b) -> a有序,b在a的基础上再排序

  1. 字符串根据散列度创建索引 — 前缀索引
    当字段值比较长的时候,建立索引会消耗很多的空间,搜索起来也会很慢。我们可以通过截取字段的前面一部分内容建立索引,这个就叫前缀索引。
    列重复的值越少,离散度越高,重复的值越多离散度越低。
    离散度越高,在查询时,扫描的行数越少,效率越高。
    散列度计算公式:
    count(distinct(column_name)) : count(*) – 列的全部不同值个数:所有数据行行数
    参考 :
//查看截取值select substr(username,1,10) from tb_user;// 查看散列度select (select count(distinct(SUBSTR(username,1,12))) from tb_user )/(select count(1); from tb_user);// 截取前十二位比较合适create index ind_company2_name on company2(username(12));
  1. 尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可

  2. 如何选择普通索引和唯一索引?

假设我们得表结构如下:

create table user(id int(11) primary key,name varchar(20) )

我们需要在name上建立索引:

  • 从查询角度看:

    select name from user where name = ‘张%’;
    唯一索引:首先建立连接->语法分析,词法分析->优化器->执行器->执行引擎。执行引擎会去B+树中寻找对应得数据页,然后判断在内存中是否存在,如果存在则在内存中进行二分查找,找到就返回(因为数据是唯一的),数据页不存在就去磁盘加载整块数据页(数据库基于数据页读写操作),再进行二分查找。
    普通索引:跟上述流程差不多,不同点是找到对应数据后继续查找下一个,如果发现第一个不匹配时就返回。也就是多了内存寻址。
    但因为实在内存中操作,所以这个影响微乎其微。

  • 从更新角度来看:

    insert into user values(1,‘李四’);
    唯一索引:需要从磁盘读取数据页page,判断是否唯一,再进行插入。
    普通索引:直接操作change buffer ,到达一定条件时merge。

    change buffer: 当需要更新一个数据页时,如果数据页在内存中就直接更新,而如果这个数据页还没有在内存中的话,在不影响数据一致性的前提下,InnoDB 会将这些更新操作缓存在 change buffer 中,这样就不需要从磁盘中读入这个数据页了。在下次查询需要访问这个数据页的时候,将数据页读入内存,然后执行 change buffer 中与这个页有关的操作。通过这种方式就能保证这个数据逻辑的正确性。需要说明的是,虽然名字叫作 change buffer,实际上它是可以持久化的数据。也就是说,change buffer 在内存中有拷贝,也会被写入到磁盘上。将 change buffer 中的操作应用到原数据页,得到最新结果的过程称为 merge。除了访问这个数据页会触发 merge 外,系统有后台线程会定期 merge。在数据库正常关闭(shutdown)的过程中,也会执行 merge 操作。显然,如果能够将更新操作先记录在 change buffer,减少读磁盘,语句的执行速度会得到明显的提升。而且,数据读入内存是需要占用 buffer pool 的,所以这种方式还能够避免占用内存,提高内存利用率。

    这两类索引在查询能力上是没差别的,主要考虑的是对更新性能的影响。所以,我建议你尽量选择普通索引。

  1. order by
    在这里插入图片描述

转载地址:http://cwtyk.baihongyu.com/

你可能感兴趣的文章