mysql前缀索引

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql前缀索引相关的知识,希望对你有一定的参考价值。

应用场景:

数据库里有个地址(address)字段,类型为varchar(100),业务决定了要经常根据address来进行查询。

确定选择性:

Sql代码 

SELECT count(DISTINCT(address))/count(*) AS Selectivity FROM info;   

+-------------+    

| Selectivity |   

+-------------+    

|      0.8745 |   

+-------------+   

<address>选择性很好,但是长度为100,对整个字段建立索引显然不合适,可以考虑建立前缀索引,例如<left(address,5)>,看看其选择性:  

Sql代码 

SELECT count(DISTINCT(left(address,5)))/count(*) AS Selectivity FROM info;   

+-------------+    

| Selectivity |   

+-------------+    

|      0.5981 |   

+-------------+    

选择性还不错,但和0.8745相比还是太低,所以我们可以将前缀长度增加到10,再看看选择性:

Sql代码 

SELECT count(DISTINCT(left(address,10)))/count(*) AS Selectivity FROM info;   

+-------------+    

| Selectivity |   

+-------------+    

|      0.8239 |   

+-------------+   

和0.8745已经很接近了,但是索引长度只有10,所以就可以决定建立前缀索引了。

前缀索引兼顾索引大小和查询速度,但是其缺点是不能用于ORDER BY和GROUP BY操作(会产生慢查询),也不能用于Covering index(即当索引本身包含查询所需全部数据时,不再访问数据文件本身)。

建立前缀索引:

alter table test.test add key (address(10));

以上是关于mysql前缀索引的主要内容,如果未能解决你的问题,请参考以下文章

面向校招MYSQL知识点整理

Spring事务传递性探讨

mysql

面试中经常要问到的, Spring事务的传递性是如何区分的呢?

「Spring」事务失效的场景

Java高级开发面试题