mysql联合索引分析测试

本文通过实验展示了在不同数据量下,使用联合索引查询性能的显著提升,特别是对于小数据集,联合索引效果尤为明显。同时,文章还探讨了LIMIT语句在查询中的应用及其对性能的影响。

小数据量(2W)条,走联合索引大概快10倍左右。

#联合索引
#和查询的顺序无关!MYSQL会自动重新排列
小数据量,效果明显。
#联合索引在单个查询和联合查询时速度比较如下:
#单个查询结果:2692条,用时0.117s
SELECT * FROM vlc_caomei_state 
WHERE 
city = '济南市' 
AND 
id < 1500000 
order by region 
#联合查询结果:2692条,用时0.017s
SELECT * FROM vlc_caomei_state 
WHERE 
city = '济南市' 
AND 
region='山东省' 
AND 
id < 1500000 
order by region 



大数据量查询,效果不明显,速度基本相同
#单个查询结果: 12w条,用时26 s
SELECT * FROM vlc_caomei_state 
WHERE 
city = '济南市' 
order by region 
#联合查询结果:12w 条,用时21 s
SELECT * FROM vlc_caomei_state 
WHERE 
city = '济南市' 
AND 
region='山东省' 
order by region 

#limit效果

mysql> explain SELECT * FROM vlc_caomei_state
    -> WHERE
    -> city = '济南市'
    -> order by region
    -> limit 0,10;
+----+-------------+------------------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table            | type  | possible_keys | key     | key_len | ref  | rows | Extra       |
+----+-------------+------------------+-------+---------------+---------+---------+------+------+-------------+
|  1 | SIMPLE      | vlc_caomei_state | index | NULL          | regions | 306     | NULL |   10 | Using where |
+----+-------------+------------------+-------+---------------+---------+---------+------+------+-------------+
1 row in set (0.00 sec)

mysql> explain SELECT * FROM vlc_caomei_state
    -> WHERE
    -> city = '济南市'
    -> AND
    -> region='山东省'
    -> order by region
    -> limit 0,10;
+----+-------------+------------------+------+---------------+---------+---------+-------------+--------+-----------------------+
| id | select_type | table            | type | possible_keys | key     | key_len | ref         | rows   | Extra                 |
+----+-------------+------------------+------+---------------+---------+---------+-------------+--------+-----------------------+
|  1 | SIMPLE      | vlc_caomei_state | ref  | regions       | regions | 306     | const,const | 263458 | Using index condition |
+----+-------------+------------------+------+---------------+---------+---------+-------------+--------+-----------------------+
1 row in set (0.07 sec)

mysql> explain SELECT * FROM vlc_caomei_state
    -> WHERE
    -> city = '济南市'
    -> order by region ;
+----+-------------+------------------+------+---------------+------+---------+------+---------+-----------------------------+
| id | select_type | table            | type | possible_keys | key  | key_len | ref  | rows    | Extra                       |
+----+-------------+------------------+------+---------------+------+---------+------+---------+-----------------------------+
|  1 | SIMPLE      | vlc_caomei_state | ALL  | NULL          | NULL | NULL    | NULL | 3918061 | Using where; Using filesort |
+----+-------------+------------------+------+---------------+------+---------+------+---------+-----------------------------+
1 row in set (0.00 sec)

mysql> explain SELECT * FROM vlc_caomei_state
    -> WHERE
    -> city = '济南市'
    -> AND
    -> region='山东省'
    -> order by region  ;
+----+-------------+------------------+------+---------------+---------+---------+-------------+--------+-----------------------+
| id | select_type | table            | type | possible_keys | key     | key_len | ref         | rows   | Extra                 |
+----+-------------+------------------+------+---------------+---------+---------+-------------+--------+-----------------------+
|  1 | SIMPLE      | vlc_caomei_state | ref  | regions       | regions | 306     | const,const | 263458 | Using index condition |
+----+-------------+------------------+------+---------------+---------+---------+-------------+--------+-----------------------+
1 row in set (0.42 sec)




总结,大数据量,索引不明显。

http://bbs.youkuaiyun.com/topics/390747126



### MySQL 修改现有索引为复合(联合索引的方式及注意事项 #### 创建新的复合索引并删除旧的单列索引 如果数据库中已经存在单列索引,并希望将其更改为多列联合索引,可以通过先创建一个新的复合索引再移除原有的单一字段上的索引来实现这一目标。 对于已有的名为`idx_single_column`的单列索引,假设该索引位于表`t_example`的`column_a`上;现在打算增加一组合成索引覆盖`column_b`和`column_c`两个额外的属性。可以采用如下SQL命令: ```sql ALTER TABLE t_example ADD INDEX idx_composite (column_a, column_b, column_c); ``` 这条语句会在指定表格里新增加一个基于多个字段组成的索引[^1]。 紧接着应当去除不再需要的老版单独索引以防止冗余: ```sql ALTER TABLE t_example DROP INDEX idx_single_column; ``` 通过上述两步操作即可完成由简单向复杂类型的转变过程[^2]。 #### 注意事项 - **遵循最左前缀原则**:当构建复合索引时,务必注意其内部各组成部分之间的排列次序因为这直接影响着后续检索过程中能否有效利用到所建好的辅助结构来加速访问速度。具体来说就是只有当查询请求里面包含了构成此类型对象的第一项或者是连续多项的时候才能触发命中机制从而发挥效能优势。 - **评估工作负载模式**:在决定调整之前应该仔细分析应用程序的工作特性特别是那些频繁发生的读写行为特征以便挑选出最适合当前环境状况下的设计方案而不是盲目跟风追求所谓的最佳实践案例[^3]。 - **测试性能变化**:任何有关于底层物理存储层面的重大改动都可能带来意想不到的结果因此建议事先准备好一套完整的基准测试方案用于对比改造前后系统的响应差异进而确认最终版本的选择合理性[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值