慢查询日志 - 行检查超过1000万,EXPLAIN显示低于10,000 - 为什么这么高?

时间:2012-03-08 07:41:26

标签: php mysql

我有一个我正在研究的数据库,它在慢查询日志中显示了一些查询。

有2个表:

table1是一个包含标准信息的企业表:名称,电话,地址,城市,州,邮政等。还有一个类别字段。这个表中有数百万行。

table2是一个类别表。只有几百行。

有问题的查询如下:

# Query_time: 20.446852  Lock_time: 0.000044 Rows_sent: 20  Rows_examined: 11410654
use my_database;
SET timestamp=1331074576;
SELECT table1.id, name, phone, address, city, state, zip 
FROM table1 
INNER JOIN table2 ON table2.label=table1.category 
WHERE state = 'tx' and city = 'San Antonio' 
and category.label LIKE 'Health Care & Medical%' group by table1.id limit 0,20;

查询的EXTENDED EXPLAIN如下所示:

id  select_type     table   type    possible_keys   key     key_len     ref     rows    filtered    Extra
1   SIMPLE  table1  index   indx_state,indx_city,index_category,cat_keywords    PRIMARY     4   NULL    5465    946.92  Using where
1   SIMPLE  table2  ref     category_label  category_label  602     my_table.table1.category    1   100.00  Using where; Using index

问题在于:此查询运行时间为20秒,显示在慢查询日志中,并且需要永久加载html页面。

表1中的总记录超过1000万条记录,但“圣安东尼奥”只有70,000条记录。匹配查询的总记录(忽略限制)只有几千。索引设置在所有内容上,EXPLAIN似乎反映了这一事实。

为什么检查的行显示为1100万?

我觉得这必须是查询拖拽这么多的部分原因。

一如既往地感谢....

2 个答案:

答案 0 :(得分:2)

我确实对这篇文章提出了一些建议并创建了一个关于城市,州的索引。它确实没有帮助我的表现,但另一件事最终得到了帮助。通过在两个列上放置一个索引,我发现的修复很可能也会更有效。

然而,解决方案是添加USE INDEX:

http://dev.mysql.com/doc/refman/5.1/en/index-hints.html

通过定义要使用的索引,查询时间从30秒减少到1.5秒。

我不知道为什么会奏效,但确实如此。

答案 1 :(得分:0)

好像你需要城市字段的综合索引。

ALTER TABLE table1 ADD INDEX(city, state);

我使用city作为第一个字段,因为我认为它会提供更好的选择性。您还可以在table1上使用查找表和外键并替换字符串值。性能将受益,并且在同一个表中不重复使用相同的字符串值将减少大小。