繁体   English   中英

使用 join 和 group by 子句选择查询中的 MySQL 性能问题

[英]MySQL performance issue in select query with join and group by clause

查询包含大约 700,000 条记录的表时,我面临性能问题。 对于特定的 item_id,第一次执行查询需要超过 10 秒,如果我更改查询中的 item_id 值,则查询需要几乎相同的时间来执行。 但是,除非重新启动服务器,否则对相同 item_id 的后续查询会很快。

我试图执行的查询是 -

select SQL_NO_CACHE item_id, item_rate_id, invoice_type, sum(qty_computed) as qty
from transaction_item 
left join transaction_customer
       on transaction_item.invoice_id = transaction_customer.invoice_id 
where item_id = 17179
group by item_rate_id, invoice_type

我的表(InnoDB)结构是 -

表:transaction_item(无主键,INDEX:item_id,包含约 700,000 行)

在此处输入图片说明

表 transaction_customer(主键:invoice_id,包含约 100,000 行) 在此处输入图片说明

在上述查询上运行解释给出以下输出:

在此处输入图片说明

my.ini 配置

[mysqld]
query_cache_size=0
query_cache_type=0
innodb_buffer_pool_size = 1G

任何关于微调 MySQL 配置/数据库架构的帮助将不胜感激。

对于您描述的查询,您的索引编制还不错。 损害您的性能的是这两个表在每一行中都有大量数据。 查询需要每个表中不在二级索引中的元素,因此与指定项目相关的表的大块需要在 innodb 缓冲池中。 我没有查看确切的数字,但是 1G 似乎还不够,您对第二次查询变得更快的描述似乎支持这一点(尤其是在SQL_NO_CACHE和查询缓存禁用的情况下(很好,它被禁用)。

建议 1:增加innodb_buffer_pool大小。 查看SHOW GLOBAL STATUS LIKE 'innodb_buffer_pool%'并查看在查询之间从缓冲区清除的项目数。

如果您真的坚持可用的 RAM,并遵循 @Drapp 对索引的建议主题,将允许仅将 innodb 缓冲池用于索引而不是完整的表。 此 innodb_buffer_pool 正在与其他查询竞争,因此以下内容的全局影响有限。

建议 2:(如果 #1 无法完成)

ALTER TABLE transaction_item
DROP INDEX item_id
ADD INDEX item_id (item_id, item_rate_id, qty_computed );

ALTER TABLE transaction_customer
ADD INDEX id_type (invoice_id, invoice_type);

注意:删除了排序,这是GROUP BY所必需的。 谢谢瑞克

格式化查询以提高可读性,但还添加了别名,以便将来有人不必猜测哪些列来自哪个表。

无论如何,为了帮助优化查询,您需要一个复合索引来帮助 where、join 和 order by。

我会在您的 Transaction_Item 表上创建一个索引 (item_id, item_rate_id, invoice_id )

此外,在您的 Transaction_Customer 表上,在 (Invoice_id, Invoice_Type ) 上有一个索引

select SQL_NO_CACHE 
        ti.item_id, 
        ti.item_rate_id, 
        tc.invoice_type, 
        sum(ti.qty_computed) as qty
    from 
        transaction_item ti
            left join transaction_customer tc
                on ti.invoice_id = tc.invoice_id 
    where 
        ti.item_id = 17179
    group by 
        ti.item_rate_id, 
        tc.invoice_type

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM