【问题标题】:Querying huge table in MySQL在 MySQL 中查询大表
【发布时间】:2012-01-13 02:11:21
【问题描述】:

我有一个大约有 100 万行的表(物理磁盘上的大小接近 8 GB,因为它有一个文本列),这需要大量时间来处理任何事务。特别是对于“选择”,它需要大量时间,例如没有任何条件的计数查询大约需要 20 分钟,即select count(*) from TestPerformance

表架构是:

名称:测试性能

Field       Type    Null    Key     Default     Extra

ID      int(11)     NO  PRI     null    
TEXT        text        YES         null    
CATEGORY    varchar(100)    YES     MUL     null    
DDOMAIN     varchar(100)    YES         null    
NETWORK     varchar(100)    YES         null    
NODE        varchar(100)    YES         null    
ENTITY      varchar(100)    YES     MUL     null    
SEVERITY    int(11)     YES         null    
TTIME       bigint(20)  YES         null    
SOURCE      varchar(255)    NO  MUL     null    
HELPURL     varchar(100)    YES         null    
WEBNMS      varchar(100)    YES         null    
GROUPNAME   varchar(100)    YES         null    
OWNERNAME   varchar(25)     NO  PRI     null      

索引是

Table           Non_unique  Key_name        Seq_in_index    Column_name     
TestPerformance     0       PRIMARY         1       ID      
TestPerformance     0       PRIMARY         2       OWNERNAME   
TestPerformance     1       TestPerformance0_ndx    1       ID      
TestPerformance     1       TestPerformance1_ndx    1       OWNERNAME   
TestPerformance     1       TestPerformance_ndx     1       CATEGORY    
TestPerformance     1       TestPerformance_ndx     2       SOURCE      
TestPerformance     1       TestPerformance_ndx1    1       ENTITY      
TestPerformance     1       TestPerformance_ndx2    1       SOURCE  

我已将 key_buffer 大小调整为 1 GB,但性能没有任何变化。

如何在不删除任何数据的情况下加快该表的事务处理?

我不是数据库专家。请提供您的建议,以提高表格的性能。

【问题讨论】:

  • 您没有向我们展示导致问题的查询。
  • 使用mysqldump找出耗时较长的查询。
  • SELECT count(id) FROM TestPerformance 需要这么长时间吗?只选择您需要的字段。
  • @Hikaru-Shindo 你的建议没有意义, COUNT(*) 不会做你暗示的事情。我建议看看 [link]dev.mysql.com/doc/refman/5.0/en/…
  • @ramachandran-natesan 告诉我们您的表引擎是什么以及您正在运行什么查询。

标签: mysql performance select query-optimization


【解决方案1】:

如何在不删除任何数据的情况下加快该表的事务处理?

100 万行不是很多数据。 8Gb 是相当大的数据量。

将文本类型列移动到一个单独的表格中(具有 1:1 的关系)。将这些 varchar 表的大小减小到保存数据所需的最小大小(或考虑将任何您不需要用于过滤的表移至其他表)。

你真的需要 id ownername 作为主键吗?我怀疑 id 可能是唯一的。如果是这样,请丢失 TestPerformance0_ndx - 这是多余的。实际上,您应该开始分析您的日志并查看 DBMS 实际需要哪些索引来服务查询并相应地修改架构

【讨论】:

  • 感谢您的评论,根据您的建议,我删除了 TestPerformance0_ndx 和 TestPerformance1_ndx。我可以看到表大小从 8 GB 下降到 6 GB。我必须检查它是否有助于提高性能。
【解决方案2】:

对您的查询运行 EXPLAIN(您应该发布给我们查看)。这将有助于确定您的查询尝试使用哪些索引以及哪些列正在使用全表扫描。

另外,不要选择 count *,而是计算您的主要 reid,以便它可以使用您的索引来计算。

【讨论】:

  • @davidethell 解释 select * from Event where source=1000 and category=10;编号 |选择类型 |表|类型 |可能的键 |关键 | key_len |参考 |行 |额外 1 |简单 |活动 |全部 |事件_ndx,事件_ndx2 |空 |空 |空 | 808515 |使用哪里
  • @ramachandran 您正在获得全表扫描,您可以从类型下的 ALL 的解释结果中看到。你有一个关于来源和类别的索引,所以你应该在那里得到一些帮助。您最近是否分析过表格以确保索引是最新的?
猜你喜欢
  • 1970-01-01
  • 2012-07-17
  • 1970-01-01
  • 1970-01-01
  • 2016-09-30
  • 2016-04-14
  • 1970-01-01
  • 2011-06-20
  • 2017-03-15
相关资源
最近更新 更多