我有一个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 子句,查询以毫秒为单位运行,但是对于order by,大约需要1分钟。该表预计将增加到1200万至1500万个记录。
我在AWS中的MySql内存优化实例中运行xLarge 5.7
UPDATE 1 updateDate有一个时间组件并被索引(B树,非唯一)
更新2----虽然我不知道为什么
SELECT * FROM (select * from transactions order by updateDate) transactions
join lookupA on (well indexed columns)
.. ( 12 lookup table joins)
limit 500发布于 2019-03-20 18:01:54
在限制查询大小之前,MySQL可能正在做大量的查询工作。这似乎是MySQL的一个已知弱点。
尝试在子查询中执行select事务,以便在执行联接之前限制结果集大小。
SELECT * FROM (select * from transactions order by updateDate limit 500) transactions
join lookupA on (well indexed columns)
.. ( 12 lookup table joins) 发布于 2019-03-20 17:48:27
如果您还没有它,ORDER BY肯定会从索引中获益:
create index ix1 on transactions (updateDate);发布于 2019-04-09 21:11:40
解决这一问题的通常方法:
SELECT ... JOIN ...
LIMIT ...是:
LIMIT行的行的LIMIT值。JOINs以获取其余信息。在您的查询中,优化器抛出了它的双手,只做了所有的JOIN (尽可能地优化每个表),生成一个大的(多行,多列)中间表,然后应用ORDER BY (对许多列的许多行进行排序)和LIMIT (交付其中的一些行)。
对于INDEX(OrderDate) (该列在表中选择使用JOINing启动),优化器至少可以考虑使用索引。但这可能是最糟糕的情况--如果没有500行行可供使用,它将完成所有的工作!
https://stackoverflow.com/questions/55267087
复制相似问题