【发布时间】:2014-01-21 12:28:10
【问题描述】:
我有一个查询(目的是制作视图),它使用几个连接来获取每一列。对于添加的每组连接,性能会迅速下降(指数级?)。
加快查询速度的好方法是什么?请查看查询中的 cmets。
如果有帮助,这是使用 WordPress 数据库架构。
这是 EXPLAIN 的截图
产品表
+--+----+
|id|name|
+--+----+
|1 |test|
+--+----+
元数据表
+----------+--------+-----+
|product_id|meta_key|value|
+----------+--------+-----+
|1 |price |9.99 |
+----------+--------+-----+
|1 |sku |ABC |
+----------+--------+-----+
TERM_RELATIONSHIPS 表
+---------+----------------+
|object_id|term_taxonomy_id|
+---------+----------------+
|1 |1 |
+---------+----------------+
|1 |2 |
+---------+----------------+
TERM_TAXONOMY 表
+----------------+-------+--------+
|term_taxonomy_id|term_id|taxonomy|
+----------------+-------+--------+
|1 |1 |size |
+----------------+-------+--------+
|2 |2 |stock |
+----------------+-------+--------+
条款表
+-------+-----+
|term_id|name |
+-------+-----+
|1 |500mg|
+-------+-----+
|2 |10 |
+-------+-----+
查询
SELECT
products.id,
products.name,
price.value AS price,
sku.value AS sku,
size.name AS size
FROM products
/* These joins are performing quickly */
INNER JOIN `metadata` AS price ON products.id = price.product_id AND price.meta_key = 'price'
INNER JOIN `metadata` AS sku ON products.id = sku.product_id AND sku.meta_key = 'sku'
/* Here's the part that is really slowing it down - I run this chunk about 5 times with different strings to match */
INNER JOIN `term_relationships` AS tr ON products.id = tr.object_id
INNER JOIN `term_taxonomy` AS tt
ON tr.term_taxonomy_id = tt.term_taxonomy_id AND tt.taxonomy = 'size'
INNER JOIN `terms` AS size
ON tt.term_id = size.term_id
【问题讨论】:
-
OR可以杀死索引使用,尝试使用联合重写。 -
显示每个表的
DESC tableName的输出。 -
或至少输出
EXPLAIN <your SQL>; -
@Manu 我在问题中添加了 EXPLAIN 结果的图像。谢谢。
-
解释肯定是不同的查询!表 tt2、tt3 不存在。 -1,直到你修复。
标签: mysql sql performance select query-optimization