mysql:查询表只使用多字段索引的一个字段

时间:2016-09-19 15:29:31

标签: mysql indexing

我有一个大的mysql表(5亿行),最初只有一个索引,因为我有一个程序可以过滤它:

KEY `id_agent_ip` (`agent_ip`)

有一次,我有另一个程序总是过滤两个字段agent_ipds_index。为了加快查询速度,我将索引更改为:

KEY `id_agent_ip_ds_index` (`agent_ip`,`ds_index`)

这解决了我同时查询两个字段的问题,但我原来只查询agent_ip的程序就像慢4倍

我的问题是:如果我有多字段索引并且WHERE语句中只使用了一个字段,那么mysql是否会回退到表扫描状态?或者是因为mysql需要加载更多数据?我对两个表的相同查询都进行了explain,结果显示:

+----+-------------+-------------------------------+------+----------------------+----------------------+---------+-------+---------+-------------+
| id | select_type | table                         | type | possible_keys        | key                  | key_len | ref   | rows    | Extra       |
+----+-------------+-------------------------------+------+----------------------+----------------------+---------+-------+---------+-------------+
|  1 | SIMPLE      | double_column_index_table     | ref  | id_agent_ip_ds_index | id_agent_ip_ds_index | 768     | const | 7159997 | Using where | 
+----+-------------+-------------------------------+------+----------------------+----------------------+---------+-------+---------+-------------+

+----+-------------+---------------------------+------+---------------+-------------+---------+-------+---------+-------------+
| id | select_type | table                     | type | possible_keys | key         | key_len | ref   | rows    | Extra       |
+----+-------------+---------------------------+------+---------------+-------------+---------+-------+---------+-------------+
|  1 | SIMPLE      | single_column_index_table | ref  | id_agent_ip   | id_agent_ip | 768     | const | 6342786 | Using where | 
+----+-------------+---------------------------+------+---------------+-------------+---------+-------+---------+-------------+

我无法将解释输出与性能问题联系起来,除了double_column_index_table似乎检查的行多于single_column_index_table这一事实,所以我需要一些帮助来理解这一点。

另一个问题是:创建两个单独的索引是否有意义,一个在agent_ip上,另一个在ds_index上?我会尝试,但同时如果有人能够解释它背后的理论会很棒。

0 个答案:

没有答案