我的purchaseItems表约有。 400万行:
itemId | orderQuantity | inStockQuantity | backorderQuantity | backorderOrderedQuantity
我的查询:
SELECT * FROM purchasedItems
WHERE backorderOrderedQuantity < backorderQuantity
我有关于backorderQuantity和backorderOrderedQuantity的索引 - 并且它们都组合在一起。但我的查询仍然需要约。 2-3秒。
我可以做些什么来提高速度?
从评论中更新
我的数量列是smallint(3)。
结果是很少的行。 20最多
EXPLAIN
:
Select type: SIMPLE
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: all of them
extra: Using where
答案 0 :(得分:1)
MySQL不支持使用索引进行t1.col1 < t1.col2
比较。 stackexchange已经有一些问题可以解答您的问题。
我添加了以backorder_diff
计算的索引列backorderOrderedQuantity - backorderQuantity
(创建插入和更新触发器,可以保持列更新,而不需要更多的内务管理),只需使用:< / p>
WHERE backorder_diff > 0
答案 1 :(得分:0)
你应该做什么:
在您的查询中运行EXPLAIN
:
EXPLAIN SELECT * FROM purchasedItems
WHERE backorderOrderedQuantity < backorderQuantity
确保使用索引。
确保backorderOrderedQuantity和backorderQuantity是整数(最好的是相同的类型)。可能应该尽可能小(如果int(1)足够不使用int(8))
确保您没有记录所有记录。我不知道您的查询返回了多少记录,但您应该添加一些限制(10/100)而不返回例如100万条记录 - 例如在查询结尾添加LIMIT 100
修改强>
我已经检查了这一点,似乎MySQL在这样的查询中根本没有使用索引,所以你可能需要创建触发器来插入/删除这些数据到额外的表。你可以在那里存储例如itemId(如果它们是唯一的)