我对 mysql 优化和例程有一些经验,但最近有一些事情吸引了我。
我在 ec2 实例上使用本地 mysql 安装,然后刚刚迁移到 RDS,这样我就可以高枕无忧了。
问题是我的应用程序存在一些遗留问题,之前在 mysql 5.1 上运行,现在在 mysql 5.6 上运行。
我们的数据库是建立在index_merge将被mysql使用的前提下的,所以我们的索引不是复合的;它们都会影响单列;我知道这可能有多糟糕,也知道它有多糟糕,但到目前为止它运行良好;我现在无法真正更改它,因为我们有 300 多张桌子。
让我陷入麻烦的是我的一张桌子控制着库存。该表具有以下结构:
id (PK)
companyId (btree index)
productId (btree index)
transactionType (input, output or stock balance; btree index)
transactionDate (btree index)
transactionPrice
Run Code Online (Sandbox Code Playgroud)
以及其他一些并不重要的专栏。
当我运行选择查询来获取给定产品的最后价格时,如下所示:
SELECT
transactionPrice
FROM
stock
WHERE
productId = x
AND transactionType = 'input'
AND companyId = y
AND transactionDate < '2017-07-07'
ORDER BY transactionDate DESC
LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
我所期望的是 MySQL 会合并(很可能)非常具体的 ProductId 和 companyId 索引,并读取大约 4 行;但实际发生的情况是,MySQL 决定通过对 transactionDate 进行排序而不将其合并到任何其他索引来迭代超过 …