使用<慢查询在一个4.000.000行的表中

时间:2014-07-09 14:52:01

标签: mysql select

我的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

2 个答案:

答案 0 :(得分:1)

MySQL不支持使用索引进行t1.col1 < t1.col2比较。 stackexchange已经有一些问题可以解答您的问题。

我添加了以backorder_diff计算的索引列backorderOrderedQuantity - backorderQuantity(创建插入和更新触发器,可以保持列更新,而不需要更多的内务管理),只需使用:< / p>

WHERE backorder_diff > 0

答案 1 :(得分:0)

你应该做什么:

  1. 在您的查询中运行EXPLAIN

     EXPLAIN SELECT * FROM purchasedItems 
     WHERE backorderOrderedQuantity < backorderQuantity
    

    确保使用索引。

  2. 确保backorderOrderedQuantity和backorderQuantity是整数(最好的是相同的类型)。可能应该尽可能小(如果int(1)足够不使用int(8))

  3. 确保您没有记录所有记录。我不知道您的查询返回了多少记录,但您应该添加一些限制(10/100)而不返回例如100万条记录 - 例如在查询结尾添加LIMIT 100

  4. 修改

    我已经检查了这一点,似乎MySQL在这样的查询中根本没有使用索引,所以你可能需要创建触发器来插入/删除这些数据到额外的表。你可以在那里存储例如itemId(如果它们是唯一的)