我有一个我正在研究的数据库,它在慢查询日志中显示了一些查询。
有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万?
我觉得这必须是查询拖拽这么多的部分原因。
一如既往地感谢....
答案 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上使用查找表和外键并替换字符串值。性能将受益,并且在同一个表中不重复使用相同的字符串值将减少大小。