MySQL查询运行对于大型数据库来说确实很慢

时间:2010-08-24 04:28:31

标签: sql mysql query-optimization

我正在尝试从数据库中提取重复的行。我有一个清单表和listing_meta表,其中包含其他信息。 listing_meta表有超过16,000行。当我运行下面的查询时,它运行速度非常慢。

我不明白为什么。我的代码有问题吗?

SELECT l.id FROM listings AS l
   LEFT JOIN listings_meta AS lm ON lm.listing_id = l.id AND lm.meta_key = 'email'
   LEFT JOIN listings_meta AS lm2 ON lm2.listing_id = l.id AND lm2.meta_key = 'submitter_email'
   WHERE lm.meta_value = 'test@test.com' OR lm2.meta_value = 'test@test.com' OR l.listing_title RLIKE 'Test'
   GROUP BY l.id LIMIT 1

我是否可以采取一些措施来改善大型表的加载时间?

2 个答案:

答案 0 :(得分:2)

你有关于listing_id和meta_key的索引吗?你应该在你要排序或匹配的任何字段上有一个索引,因为否则mysql必须通过整个表来查找每一行。

您还可以在语句前面添加EXPLAIN以查看mysql如何进行查找。

答案 1 :(得分:2)

索引

您是否有任何索引 - 特别是LISTINGS_META.listing_id

我将您的查询重写为:

   SELECT l.id 
     FROM listings AS l
LEFT JOIN listings_meta AS lm ON lm.listing_id = l.id 
                             AND lm.meta_key = 'email'
                             AND lm.meta_value = 'test@test.com'
LEFT JOIN listings_meta AS lm2 ON lm2.listing_id = l.id 
                              AND lm2.meta_key = 'submitter_email'
                              AND lm2.meta_value = 'test@test.com'
    WHERE l.listing_title RLIKE 'Test'
 GROUP BY l.id LIMIT 1

WHERE子句

RLIKE(任何关于此问题的MySQL正则表达式功能)与以下内容相同:

WHERE l.listing_title LIKE '%Test%'

两者都不能使用LISTING.listing_title列上的索引......

改进listing_title搜索的最佳方法是LISTING表是MyISAM,因此您可以在LISTING.listing_title列中添加全文索引以便使用:< / p>

WHERE MATCH(l.listing_title) AGAINST ('Test')

...但请注意全文搜索(FTS)的最小字长为3个字符....

相关问题