2014-01-27 96 views
1

我们正在面对与选择查询相关的性能问题。 我们有报告表,其中包含大约2 Crore(2000万)记录。MySQL:选择查询性能问题

当我们执行简单计数(*)来检查计数时,它将花费超过1分钟来显示结果。

下面是关于MySQL,服务器和查询信息

系统信息

OS    : Debian 6.0.7 
    Model   : AMD Opteron(tm) Processor 6172 
    cpu MHz  : 2100.154 
    cache size  : 512 KB 
    processor  : 2 

Memory  total  used  free  shared buffers  cached 
Mem:   16083  6335  9747   0  153  5323 

Mysql的信息

mysql Ver 14.14 Distrib 5.1.66, for debian-linux-gnu (x86_64) using readline 6.1 

my.conf设置

key_buffer    = 16M 
    max_allowed_packet  = 16M 
    thread_stack   = 192K 
    thread_cache_size  = 8 
    max_connections  = 1000 
    table_cache   = 128 
    innodb_buffer_pool_size = 3G 
    query_cache_limit  = 512M 
    query_cache_size  = 3G 

mysql> select count(*) from reports; 
+-----------+ 
| count(*) | 
+-----------+ 
| 23311587 | 
+-----------+ 
1 row in set (67.07 sec) 

DB engine : Innodb

编辑:查询执行索引和无索引

mysql> select count(id) from Reports USE INDEX(PRIMARY); 

+-----------+ 
| count(id) | 
+-----------+ 
| 17835433 | 
+-----------+ 
1 row in set (55.56 sec) 

mysql> 
mysql> select count(id) from Reports; 

+-----------+ 
| count(id) | 
+-----------+ 
| 17835433 | 
+-----------+ 
1 row in set (55.65 sec) 

我与性能问题挣扎,任何人都可以请帮我提高表的性能?

+0

请显示表格布局。 –

+0

尝试只是做一个索引/键不计数*看看是否有所作为 – Dave

+0

这可以帮助:http://stackoverflow.com/questions/1332624/speeding-up-row-counting-in-mysql – NewInTheBusiness

回答

1

看一看This

尝试像

SELECT COUNT(coupon_id) FROM coupon USE INDEX (PRIMARY); 

凡coupon_id在优惠券表

1

主键这是因为你正使用InnoDB。

InnoDB表在简单计数(*)查询上很慢,因为它需要为此执行全表扫描。

您可以通过使用PRIMARY索引来提高此查询的性能。

select count(reportId) from reports USE INDEX(PRIMARY); 

这里真正的问题是:你需要执行这种查询吗?大多数情况下,您会使用WHERE子句进行计数,在给定正确索引的情况下,它应该运行得很好。

0

的MySQL通过实际观察数据执行count(*)。如果您有主键索引,它将扫描主键索引以获取结果,而不是原始数据。我印象深刻的是,您的系统性能如此一致,以至于相同的操作在一次情况下花费了55.56秒,而在另一种情况下花费了55.65秒 - 差异不到半个百分点。

执行扫描需要将索引加载到内存中。如果索引不适合内存,则需要更长的时间。检查您的系统内存配置,以确保一次可以容纳1700万条记录。唉,我并不十分熟悉配置MySQL的所有参数,但在具有16 GB内存和3Gbytes缓冲池的计算机上,应该有足够的内存。

如果此类查询的性能很重要,则可能需要考虑其他选项。在1700万行的表上进行特别查询需要时间。如果您需要速度性能,请考虑使用数据集市方法,在这种方法中,您可以通过解决大多数用户问题的方式来提取和汇总数据。

+0

感谢您的答案,您可以请为我提供任何相关链接的数据集市,我如何实现它与MySQL – juned

+0

关于这个问题的一本好书是拉尔夫金博尔的“The数据仓库工具包“。 –