MySQL中的大表查询

MySQL中的大表查询,mysql,performance,select,query-optimization,Mysql,Performance,Select,Query Optimization,我有一个大约有100万行的表(物理磁盘上的大小接近8GB,因为它有一个文本列),这对于任何事务来说都需要很多时间。特别是对于“选择”,它需要大量的时间,例如,在没有任何条件的情况下进行计数查询大约需要20分钟,即从TestPerformance中选择计数(*) 表架构为: 名称:TestPerformance Field Type Null Key Default Extra ID int(11) NO PRI null

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

表架构为:

名称: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\u buffer
大小调整为1GB,但性能没有任何变化

如何在不删除任何数据的情况下加速此表的事务处理

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

对您的查询运行解释(您应该将其发布给我们查看)。这将有助于识别查询试图使用的索引以及使用完整表扫描的列

另外,不要选择count*,而是计算主recid,这样它就可以使用索引进行计数

如何在不删除任何数据的情况下加速此表的事务处理

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

将“文本类型”列移动到速率表中(具有1:1关系)。将这些VARCHAR表的大小减小到保存数据所需的最小大小(或者考虑将不需要的任何过滤到另一个表)。
您真的需要主键的id和ownername吗?我怀疑我的身份可能是独一无二的。如果是这样,请丢失TestPerformance0\u ndx-这是多余的。事实上,您应该开始分析日志,看看DBMS实际需要哪些索引来为查询提供服务并相应地修改模式

您没有向我们显示导致问题的查询。使用mysqldump查找需要花费大量时间的查询。
从TestPerformance中选择count(id)
是否需要同样长的时间?只选择您需要的字段。@Hikaru Shindo您的建议没有意义,COUNT(*)没有做您暗示的事情。我建议看一下[link]@ramachandran natesan告诉我们您的表引擎是什么,您正在运行什么查询。@DavidHell explain select*from Event,其中source=1000,category=10;id |选择|类型|类型|可能的|键|键|列|参考|行|额外1 |简单|事件|所有|事件| ndx,事件| NULL | NULL | NULL | NULL | 808515 |where@ramachandran您将得到一个完整的表格扫描,您可以从ALL-under-type的解释结果中看到。你有一个关于源和类别的索引,所以你应该在那里得到一些帮助。您最近是否分析了表以确保索引是最新的?感谢您的评论,根据您的建议,我删除了TestPerformance0\u ndx和TestPerformance1\u ndx。我可以看到表大小从8GB下降到6GB。我必须检查它是否有助于提高绩效。