有一个我不明白的MySQL性能问题。
这个查询通常需要1秒来执行,但有时需要5+分钟。
SELECT sb.id AS id, sb.name AS name,
ROUND(sb.dkprice / 100, 0) AS price, bs.name AS shopname, country
FROM shopbikes sb, categoriesshopbikes csb, shops s
WHERE sb.id = csb.`shopbikeid`
AND csb.categoryid = 93
AND sb.brand = 'Ghost'
AND dkprice > 0
AND sb.dkprice IS NOT NULL
AND sb.`shopid` = s.id
ORDER BY dkprice
LIMIT 1有时有5-8个这样的查询同时运行,针对不同的品牌。
当我执行“显示完整PROCESSLIST”时,我可以看到许多这些查询正在运行,其中一些查询已经运行了很长时间(最多几分钟)。
查询中的表都有所有相关列(即表所匹配的列)的索引。
表的大小:
你知道哪里出问题了吗?我怎么才能解决呢?
更新:我已将查询转换为显式联接:
SELECT sb.id AS id, sb.name AS NAME,
ROUND(sb.dkprice / 100, 0) AS price, s.name AS shopname, country
FROM shopbikes sb
JOIN categoriesshopbikes csb ON (sb.id = csb.shopbikeid)
JOIN shops s ON (sb.shopid = s.id)
WHERE csb.`categoryid` = 93
AND sb.`brand` = 'Cannondale'
AND dkprice > 0
AND dkprice IS NOT NULL
ORDER BY dkprice
LIMIT 1 没什么用。查询仍然需要很长时间才能执行。
发布于 2016-07-25 14:12:25
csb需要INDEX(shopbikeid, category_id)的两种顺序。如果categoriesshopbikes是一个多对多映射表,那么您是否遵循了http://mysql.rjweb.org/doc.php/index_cookbook_mysql#many_to_many_mapping_table的所有建议?
按照这个顺序,sb需要INDEX(brand, dkprice)。
我认为AND dkprice IS NOT NULL与AND dkprice > 0是多余的。
发布于 2016-07-25 12:51:58
FROM shopbikes sb, categoriesshopbikes csb, shops s我必须查看查询计划,但我认为这一行是问题所在。这类FROM子句可能会从列出的表(即600 k* 100 k*100行)创建笛卡尔积。
我猜适当的JOIN条款会有帮助
FROM shopbikes sb JOIN categoriesshopbikes csb ON (sb.id = csb.shopbikeid) JOIN shops s ON (sb.shopid = s.id)https://stackoverflow.com/questions/38568159
复制相似问题