MySQL创建前缀索引和索引选择性

“天忽作晴山捲慢,云犹含态石披衣”
什么是前缀索引: 一般情况下,如果需要作为索引的那一列长度很长.就需要使用前缀索引来节约索引控件.即只需要为前面几个字符作为索引.
什么是索引选择性: 索引选择性是指,不重复的索引值(也称为基数)和数据表的记录总数(#T)的比值,范围从1/#T到1之间.索引选择性越高则查询效率越高,因为选择性高的索引可以让MySQL在查找时过滤掉更多的行.唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的.
举个例子说明:这里有一张测试表(只截图其中一列,该列待会要用到),如下:
这里写图片描述
写个简单的查询:用时0.111秒(这是没有加前缀索引的结果)
这里写图片描述
下面开始给表加前缀索引:
计算索引前缀的诀窍在于要选择足够长的前缀以保证较好的选择性,同时又不能太长(以便节约空间),前缀应该足够长,以使得前缀索引的选择性接近于索引整个列.话句话说,前缀的”基数”应该接近于完整列的”基数”.
计算完整列的基数:

select COUNT(DISTINCT id_address)/COUNT(*) from tabelName;

这里写图片描述
我这里的结果为0.7864
接下来计算最接近完整列的基数:

select COUNT(DISTINCT LEFT(id_address,3))/COUNT(*) as sel3,
COUNT(DISTINCT LEFT(id_address,4))/COUNT(*) as sel4,
COUNT(DISTINCT LEFT(id_address,5))/COUNT(*) as sel5,
COUNT(DISTINCT LEFT(id_address,6))/COUNT(*) as sel6,
COUNT(DISTINCT LEFT(id_address,7))/COUNT(*) as sel7,
COUNT(DISTINCT LEFT(id_address,8))/COUNT(*) as sel8,
COUNT(DISTINCT LEFT(id_address,22))/COUNT(*) as sel22,
COUNT(DISTINCT LEFT(id_address,23))/COUNT(*) as sel23,
COUNT(DISTINCT LEFT(id_address,24))/COUNT(*) as sel24,
COUNT(DISTINCT LEFT(id_address,25))/COUNT(*) as sel25
 from tableName;

这里写图片描述
这里算出当前缀为25时,该基数等于完整列的基数.
接下来建立长度为25的前缀索引.

alter table tableName add key (id_address(25));

建立完成之后,再来执行刚才耗时0.111秒的语句,看耗时多少.
这里写图片描述
这次只耗时0.037秒..可以看出前缀索引的效果.

刚才的前缀索引是通过算出来的最佳值(长度为25).这次我们来试一下随机值.设置前缀索引长度为15;

alter table tableName add key (id_address(15));

再来看下查询耗时多少.
这里写图片描述
这次用时0.044秒.由此可见索引县选择性的重要性.

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用以下语句对employees表的address进行前缀索引: ALTER TABLE employees ADD INDEX idx_address_prefix (address(10)); 其中,idx_address_prefix是索引名称,address是要索引名,10表示前缀长度为10个字符。这样可以加快对address的模糊查询和排序操作。 ### 回答2: 对employees表的address进行前缀索引可以优化数据库的查询性能,提高查询效率。所谓前缀索引,就是将索引建在字符串的前缀上,而不是整个字符串上。例如,对于一个地址字符串“上海市松江区新桥镇解放路”,如果我们建立一个前缀长度为3的索引,那么就将索引建在“上海市”、“松江区”、“新桥镇”、“解放路”上,而不是整个字符串上。 这样做的好处在于,可以大大缩短索引键的长度,使得索引占用的空间更小,同时也可以加快查询的速度。由于索引键的长度更短,可以容纳更多的索引数据,从而减少了对磁盘的I/O操作,提高了查询效率。而另一方面,由于索引键只包含前缀,所以查询结果可能会有所不准确,需要通过其他手段来进一步筛选结果。因此,在建立前缀索引时,需要权衡查询效率和查询准确性的关系。 在现实中,对于大部分的地址字段,都可以进行前缀索引。例如,对于一个城市-A-B-C-D的地址字符串,我们可以建立前缀长度为2的索引,使得查询“C市D区”这样的关键词时可以更快地找到匹配的结果。在实际操作中,可以通过以下SQL语句来为employees表的address建立前缀索引: ALTER TABLE employees ADD INDEX (address(3)); 其中,address(3)表示对address的前三个字符进行索引。通过这样的方式,我们可以优化数据库的查询性能,提高查询效率,为数据分析提供更好的支持。 ### 回答3: 在对employees表的address进行前缀索引之前,首先需要了解什么是前缀索引以及其作用。前缀索引是在一个字符串值的前面建立的索引,可以加快字符串值的查询速度,尤其在长字符串值上具有较大的优势。 在实际操作中,对employees表的address进行前缀索引的步骤如下: 1. 使用CREATE INDEX语句来创建索引。语句的基本语法如下: CREATE INDEX index_name ON table_name (column_name(length)); 其中,index_name是所创建索引的名称,table_name是要进行索引的表名,column_name是要进行索引名,length是要建立索引的字符串前缀的长度。 2. 对于address而言,建立前缀索引时需要考虑其所包含的字符串长度和分布情况。如果address中的字符串较长,可以考虑将前缀索引的长度设为6或8,以提高查询效率。如果address的字符串长度较短,则可以适当缩短前缀索引的长度。 3. 建立前缀索引时需要注意与其他索引的冲突。如果对同一建立了多个索引,可能会导致性能下降。此外,前缀索引创建也可能会影响到表的DML操作(插入、更新、删除),因此需谨慎进行。 对employees表的address进行前缀索引可以加快该的查询速度,提高数据库系统的性能表现。同时,在建立索引时需要注意余下操作的影响,确保索引的有效性和合理性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值