【发布时间】:2019-04-10 05:23:22
【问题描述】:
我有一个名为“事务”的 300 万条记录表。
CREATE TABLE transactions(
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
lookupAId int(6) NOT NULL,
.....
updateDate TIMESTAMP
)
在最坏的情况下,用户将不指定过滤器,查询将如下所示:
select * from transactions
join lookupA on (well indexed columns)
.. ( 12 lookup table joins)
order by updateDate limit 500
如果没有 order by 子句,查询将以毫秒为单位运行,但使用 order by 则需要大约一分钟。该表预计将增长到 12-15 百万条记录。
- 我的 SLA 是在一秒钟内得到结果,在 MySql 中是否可能?
- 如何优化 order by 子句以使其执行。
我在 AWS 的 xLarge 内存优化 RDS 实例中运行 MySql 5.7
UPDATE 1 updateDate 有一个时间组件并被索引(B-tree,非唯一)
更新 2 这有效,虽然我不知道为什么
SELECT * FROM (select * from transactions order by updateDate) transactions
join lookupA on (well indexed columns)
.. ( 12 lookup table joins)
limit 500
【问题讨论】:
-
updateDate 有时间组件吗?您是否尝试为 updateDate 添加索引?
-
您是从相关表中检索所有列,还是仅检索几列?您可以使用覆盖索引来避免 MySQL 遭受的“二级索引查找”。
-
你没有说,但我认为
updateDate属于表transactions。是这样吗? -
@JavaHead 您是否只对没有任何连接的事务运行查询?我引用的那个确切的查询?
-
@JavaHead 然后是连接查找使其变慢。您需要从每个表中获取哪些列?将所有行放在“覆盖索引”中;这将使查询更快。
标签: mysql sql query-performance