首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySql中具有极限的有序性优化

MySql中具有极限的有序性优化
EN

Stack Overflow用户
提问于 2019-03-20 17:42:00
回答 4查看 1.4K关注 0票数 1

我有一个300万条记录表,叫做“事务”。

代码语言:javascript
复制
CREATE TABLE transactions(
  id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  lookupAId int(6) NOT NULL,
  .....
  updateDate TIMESTAMP
)

在最坏的情况下,用户将不指定过滤器,查询如下所示:

代码语言:javascript
复制
select * from transactions
   join lookupA on (well indexed columns) 
   .. ( 12 lookup table joins) 
order by updateDate limit 500

没有order 子句,查询以毫秒为单位运行,但是对于order by,大约需要1分钟。该表预计将增加到1200万至1500万个记录。

  1. 我的SLA是在一秒钟内获得结果,在MySql中有可能吗?
  2. 如何优化order子句以使其执行。

我在AWS中的MySql内存优化实例中运行xLarge 5.7

UPDATE 1 updateDate有一个时间组件并被索引(B树,非唯一)

更新2----虽然我不知道为什么

代码语言:javascript
复制
SELECT * FROM (select * from transactions order by updateDate) transactions
   join lookupA on (well indexed columns) 
   .. ( 12 lookup table joins) 
   limit 500
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-03-20 18:01:54

在限制查询大小之前,MySQL可能正在做大量的查询工作。这似乎是MySQL的一个已知弱点。

尝试在子查询中执行select事务,以便在执行联接之前限制结果集大小。

代码语言:javascript
复制
SELECT * FROM (select * from transactions order by updateDate limit 500) transactions
   join lookupA on (well indexed columns) 
   .. ( 12 lookup table joins) 
票数 1
EN

Stack Overflow用户

发布于 2019-03-20 17:48:27

如果您还没有它,ORDER BY肯定会从索引中获益:

代码语言:javascript
复制
create index ix1 on transactions (updateDate);
票数 1
EN

Stack Overflow用户

发布于 2019-04-09 21:11:40

解决这一问题的通常方法:

代码语言:javascript
复制
SELECT ... JOIN ...
    LIMIT ...

是:

  1. 完成最少的工作量,以找到将因素纳入LIMIT行的行的LIMIT值。
  2. 将这些ids输入JOINs以获取其余信息。

在您的查询中,优化器抛出了它的双手,只做了所有的JOIN (尽可能地优化每个表),生成一个大的(多行,多列)中间表,然后应用ORDER BY (对许多列的许多行进行排序)和LIMIT (交付其中的一些行)。

对于INDEX(OrderDate) (该列在表中选择使用JOINing启动),优化器至少可以考虑使用索引。但这可能是最糟糕的情况--如果没有500行行可供使用,它将完成所有的工作!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55267087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档