本文共 1635 字,大约阅读时间需要 5 分钟。
排序?
单索引 -> 有序
联合索引 (a,b) -> a有序,b在a的基础上再排序
//查看截取值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));
尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可
如何选择普通索引和唯一索引?
假设我们得表结构如下:
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 的,所以这种方式还能够避免占用内存,提高内存利用率。
这两类索引在查询能力上是没差别的,主要考虑的是对更新性能的影响。所以,我建议你尽量选择普通索引。
转载地址:http://cwtyk.baihongyu.com/