2017-03-08 78 views
1

我在使用mysql上的大型表時遇到問題。大型表上的Mysql性能問題

我有超過2.5百萬的數據表。這是我的問題。

select count(*) from location 
    where tagCode=24345 
    and xLocation >=81 and xLocation <=264 
    and yLocation >=356 and yLocation <=484 
    and locationDate >= '2017-03-08 00:00:01' and locationDate <= '2017-03-08 11:54:01'; 

我想獲得該查詢計數的數量。但它的行數超過1秒。這導致了問題。

我在表中添加了索引。

ALTER TABLE位置ADD INDEX(tagCode,xLocation,yLocation, locationDate);

如何提高性能?

+1

'EXPLAIN'對此查詢有何說法?使用'BETWEEN'是否有幫助? – tadman

+0

您的查詢和索引對我來說看起來是最優的。如果其他列(例如locationDate)上的一個具有較低的基數然後標記代碼,則可以相應地重新排列索引。 – Strawberry

+0

單獨在數據庫上執行時行爲是否一致? – chris85

回答

-1

當你做'> ='是每個寄存器的兩個比較,試試'>'。

另一件事:

locationDate >= '2017-03-08 00:00:01' and locationDate <= '2017-03-08 11:54:01' 

我想象的要一個位置,直到「現在」,如果我是正確的嘗試只是較低條件

locationDate >= '2017-03-08 00:00:01' 

更多一點,嘗試創建隔離索引如

locationDate DESC 
tagCode ASC 
xLocation ASC 
yLocation ASC 

如果將xLocation和yLocation聲明爲double,則像Googl電子座標。

最後一件事,試着先把條件消除更多數量的不需要的行。

+0

最後一件事,在我的公司我們有1100萬的客戶,所以一般情況下我們會爲每個月創建一張表。 –

+0

另外一件事? – nikoskip

+0

直到現在,沒有。如果我還記得更多,我會發帖 –

0

最後一件事,在我的公司我們有1100萬的客戶,所以一般情況下我們會爲每個月或每個地區創建一張表格。

在你的情況下,基於LocationDate,馬貝您可以創建每月一個表太像:

coordinator_03_2017 coodinator_02_2017

所以你可以做多個線程同時查詢。

最後一件事,你可以同時做多querys,分離每間隔couting的,如:

線程1 - QUERY1:locationDate> '2017年3月1日00:00:00' 主題2-查詢2:locationDate>'2017-02-01 00:00:00'和locationDate <'2017-03-01 00:00:00' 線程N - 查詢N

+0

嘿,把它放在你的第一個答案!編輯它 – DevMoutarde

+0

對不起,我真的沒有在這裏找到這個編輯選項。 –

0

x和y座標很難索引。然而,這可能至少對於給定的例子中工作得很好,

INDEX(tagCode, locationDate, xLocation, yLocation) 

這裏是理由:

  • tagCode=測試; WHERE中的任何此類測試都需要在INDEX中排在第一位。
  • 然後你得到一個機率在一個「範圍」。由於locationDate似乎是最有選擇性的,我把它下。
  • 其餘的列是使索引「覆蓋」。也就是,全部列中提到的中的任何一個SELECT都在單個索引中。這樣,可以在索引BTree中執行查詢,而不需要觸摸數據BTree。

如果您有時日期範圍較寬,但範圍較窄,那麼您添加的索引效果最佳。所以,保持它。並添加第三個:

INDEX(tagCode, yLocation, locationDate, xLocation) 

這樣,優化程序可以從三個範圍中挑選並可能選擇最優的一個。