mysql优化-索引的长度和区分度

索引长度与区分度

 

以material_data的表为例,这个表中有多大45万的数据;

对matertial_name的字段建立索引;

 

以matertial_name字段建模普通索引,

mysql> alter table material_data add index idx_material_name(material_name);

Query OK, 0 rows affected

Records: 0  Duplicates: 0  Warnings: 0

 

执行

select * from  material_data where material_name='光缆交接箱改造';

mysql> explain select * from  material_data where material_name='光缆交接箱改造';

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

| id | select_type | table         | partitions | type | possible_keys     | key               | key_len | ref   | rows | filtered | Extra |

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

|  1 | SIMPLE      | material_data | NULL       | ref  | idx_material_name | idx_material_name | 363     | const |    6 |      100 | NULL  |

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

1 row in set


 

可以发现 索引的长度达到363个长度,这会影响索引的使用效率,那么多个长度合适呢?

 

统计各个长度索引的区分度:

 

mysql> SELECT count(distinct LEFT(t.material_name ,110))/count(1)   from  material_data t;

索引长度

区分度

1

0.0047

2

0.034

3

0.1082

4

0.1635

5

0.2166

6

0.2607

7

0.299

8

0.3335

9

0.3646

10

0.3936

11

0.419

12

0.4411

13

0.462

14

0.4812

15

0.4991

16

0.5158

17

0.5303

18

0.5426

19

0.5536

20

0.5651

25

0.6057

30

0.6303

40

0.6426

50

0.6426

60

0.6426

70

0.6426

80

0.6426

90

0.6426

100

0.6426

110

0.6426

120

0.6426

 

可以发现大概在15个长度左右比较高效;


mysql> alter table material_data add index idx_material_name(material_name(15));

mysql> explain select * from  material_data where material_name='光缆交接箱改造';

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

| id | select_type | table         | partitions | type | possible_keys     | key               | key_len | ref   | rows | filtered | Extra       |

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

|  1 | SIMPLE      | material_data | NULL       | ref  | idx_material_name | idx_material_name | 48      | const |    6 |      100 | Using where |

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

1 row in set

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
索引优化是数据库性能优化的重要部分,可以大幅提高查询效率。索引是一种数据结构,用于加速对表中数据的查找和排序。在查询中使用索引可以避免全表扫描,提高查询速度。以下是索引优化的一些技巧: 1. 确定索引类型 MySQL 支持多种索引类型,包括 B-Tree 索引、Hash 索引、Full-Text 索引等。不同的索引类型适用于不同的场景。例如,B-Tree 索引适用于范围查询,而 Hash 索引适用于等值查询。因此,在创建索引时,需要根据实际情况选择合适的索引类型。 2. 确定索引字段 索引字段是指在哪些字段上创建索引。一般来说,需要在经常用于查询的字段上创建索引。但是,创建太多的索引也会影响性能,因为每个索引都需要占用存储空间,而且在插入、更新和删除数据时也会增加额外的开销。因此,需要权衡索引的数量和存储空间的使用。 3. 索引覆盖查询 索引覆盖查询是指查询结果可以从索引中直接获取,而不需要再访问数据表。这样可以避免访问数据表的开销,提高查询效率。要实现索引覆盖查询,需要在查询语句中包含索引字段,并且查询语句只查询索引字段。 4. 索引列的顺序 在创建索引时,需要注意索引列的顺序。一般来说,应该把区分度高的列放在前面。区分度是指该列中不同值的数量与总行数之比。区分度越高,表示该列的值越能区分不同的行,因此放在前面可以提高索引效率。 5. 索引长度 索引长度是指索引列中的字符数或字节数。索引长度对查询效率有影响,因为索引长度越长,索引树的高度越高,查询时需要访问的磁盘块数也就越多。因此,需要根据实际情况选择合适的索引长度

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值