2011-12-05 70 views
2

我有一张表格,其中有大约100万行(物理磁盘上的大小接近8 GB,因为它有一个文本列),这会占用大量时间用于任何事务。特别是对于“选择”,需要花费很多时间。计数查询无需任何条件大约需要20分钟,即select count(*) from TestPerformance查询MySQL中的巨大表格

表模式是:

名称: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,但没有在性能上变化。

如何在不删除任何数据的情况下加快此表的交易?

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

+1

您没有向我们显示导致问题的查询。 –

+0

使用mysqldump查找需要很长时间的查询。 – vikky

+0

'SELECT count(id)FROM TestPerformance'花费很长时间吗?只选择你需要的字段。 –

回答

3

如何在不删除任何数据的情况下加快此表的交易?

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

将文本类型列移动到sperate表(1:1关系)。将这些varchar表的大小减小到保存数据所需的最小大小(或考虑将您不需要过滤的任何内容移动到另一个表中)。

您是否真的需要ID 主键的所有者名?我怀疑id可能是唯一的。如果是这样,则失去TestPerformance0_ndx - 这是多余的。事实上,您应该开始分析您的日志,并查看DBMS实际需要哪些索引来为查询提供服务并相应地修改架构

+0

感谢您的意见,根据您的建议我删除了TestPerformance0_ndx和TestPerformance1_ndx。我可以看到桌子的尺寸从8GB降到6GB。我必须检查它是否有助于提高性能。 –

1

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

此外,不要做select count *,而是计算您的主要recid,以便它可以使用您的索引进行计数。

+0

@ davidethell解释select * from事件来源= 1000和category = 10; ID | select_type |表| |键入| possible_keys |键| key_len | ref |行|额外 1 | SIMPLE |活动| ALL | Event_ndx,Event_ndx2 | NULL | NULL | NULL | 808515 |使用 –

+0

@ramachandran你得到了一个全表扫描,你可以从类型下的ALL解释结果中看到。你有一个关于源和类别的索引,所以你应该得到一些帮助。你最近是否做过分析表以确保指数是最新的? – davidethell