我正在尝试从数据库中提取重复的行。我有一个清单表和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
我是否可以采取一些措施来改善大型表的加载时间?
答案 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
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个字符....