索引的建立完全依赖于业务

12 月 17th, 2009 | Posted by | Filed under 未分类

本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明
网址: http://www.penglixun.com/database/index_dependent_on_business_logic.html

今天调整了一个高并发表的索引,完全感受到了索引的建立完全是依赖业务而定的,跟本身的唯一性并没有绝对量化的关系。

SQL是这样的:
select * from XXXX where create_type=2 and need_update=1;

为优化之前:
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: XXXX
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 162689
Extra: Using where
1 row in set (0.43 sec)

光看两个字段的唯一性,一般而言都不会建索引:
mysql> select create_type,count(*) from XXXX group by create_type;
+————-+———-+
| create_type | count(*) |
+————-+———-+
| 0 | 162636 |
| 2 | 63 |
+————-+———-+
2 rows in set (0.36 sec)

mysql> select need_update,count(*) from XXXX group by need_update;
+————-+———-+
| need_update | count(*) |
+————-+———-+
| 0 | 157747 |
| 1 | 4952 |
+————-+———-+
2 rows in set (0.35 sec)

两个字段都只有2个值,但是可以发现,条件中create_type=2 and need_update=1;都是结果条数很少的,分别是63条记录和4952条记录。
同时这张表并没有经常更新,于是添加了一个组合索引(create_type,need_update),再看执行计划。
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: XXXX
type: ref
possible_keys: create_type
key: create_type
key_len: 2
ref: const,const
rows: 113
Extra:
1 row in set (0.43 sec)

跟原来的扫描162689条,只有原来的0.06%,在高并发的时候效率提升可谓显著!

目前还没有任何评论.