我有一个大的mysql表(5亿行),最初只有一个索引,因为我有一个程序可以过滤它:
KEY `id_agent_ip` (`agent_ip`)
有一次,我有另一个程序总是过滤两个字段agent_ip
和ds_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
上?我会尝试,但同时如果有人能够解释它背后的理论会很棒。