2014-01-27 136 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數據倉庫工具包「。 –