mysql url 长度_MySQL——如何截取合适的左前缀索引长度

本文探讨了在MySQL中如何为URL列选择合适的左前缀索引长度,强调了索引的理想特性,包括区分度和长度的平衡。通过测试不同长度的区分度,发现对于URL列,由于前11个字符相同,可以考虑倒序存储或使用伪哈希索引来提高区分度。此外,还提到了存储引擎对索引性能的影响,建议根据实际业务逻辑创建复合索引,并提供了一些MySQL性能优化的相关命令。
摘要由CSDN通过智能技术生成

1、 理想的索引

①:查询频繁 :②区分度高 ③:长度小 ④: 尽量能覆盖常用查询字段.

注意: 索引长度直接影响索引文件的大小,影响增删改的速度,并间接影响查询速度(占用内存多).

2、针对列中的值,从左往右截取部分,来建索引

①: 截的越短, 重复度越高,区分度越小, 索引效果越不好

②: 截的越长, 重复度越低,区分度越高, 索引效果越好,但带来的影响也越大--增删改变慢,并间影响查询速度.

所以, 我们要在 区分度 + 长度 两者上,取得一个平衡.

惯用手法: 截取不同长度,并测试其区分度,

mysql> select count(distinct left(word,6))/count(*) from dict;

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

| count(distinct left(word,6))/count(*) |

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

| 0.9992 |

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

1 row in set (0.30 sec)

947dbb18a5e3

捕获.PNG

对于一般的系统应用: 区别度能达到0.1,索引的性能就可以接受.

3、对于左前缀不易区分的列 ,建立索引的技巧

如 url列

列的前11个字符都是一样的,不易区分, 可以用如下2个办法来解决

① 把列内容倒过来存储,并建立索引

Moc.udiab.www//:ptth

Ti.euxiz.www//://ptth

这样左前缀区分度大,

② 伪hash索引效果

同时存 url_hash列

典型问题

947dbb18a5e3

捕获11.PNG

答:问题出在两个方面:①建表时使用的innodb存储引擎2②varbinary(3000),因为innodb,只查询主键id时,是聚簇索引,造成大量的页分裂,所以速度慢。解决:改为myisam存储引擎

笔记(可忽略)

优化上不要脱离实际业务逻辑,独立索引没有实际意义,同时建立多个独立索引,仅有一个索引有效。应该建立复合索引

mysql 命令:

1、清除缓存:reset query cache;

2、在某列上增加索引:alter table goods add index price(shop_price);

3、使profiling生效:set profiling = 1

4、查看语句执行效率:show profiles;

5、查询语句执行效果(例如:查看索引使用情况):explain + 查询语句

6、删除索引:alter table goods drop index price;

7、添加复合索引:alter table goods add index cat_price(cat_id,shop_price);

疑问:用复合索引一定会快吗?

myisam 都是指向磁盘的,轻量级的

innodb 直接在主键索引上存储行数据

如何建立高性能索引:

首先分析这是什么表,是聚簇索引还是非聚簇索引,能否索引覆盖,是否有常用的几个列共同出现常用查询,则建立联合查询,索引的长度建立多少

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值