2016-11-29 38 views
1

我怎樣才能提高我的查詢時間?我有一個表省錢的交易與這些領域:加快SELECT查詢上大表

id, customersId, paymentId, amount, cash, createDate 

我的查詢得到了客戶的交易:

SELECT id,amount,cash,createDate 
FROM customers_transactions 
WHERE customersId = 2784 

這臺擁有1000萬的記錄或更多。該查詢大約需要13秒才能執行。

表有這些索引:

id, customersId (unique) 
customersId, createDate (unique) 

而且這些分區:

10 partiotions By RANGE on customersId 
LESS THAN 1000 
LESS THAN 2000 
LESS THAN 3000 
LESS THAN 4000 
LESS THAN 5000 
LESS THAN 6000 
LESS THAN 7000 
LESS THAN 8000 
LESS THAN 9000 
LESS THAN 10000 

該服務器有8 GB的RAM,與酷睿i5 3.2GHz的

我想運行此查詢小於0.5秒

+0

你是否做了解釋查詢的?你有沒有在桌上使用OPTIMIZE?該查詢非常簡單,所以我希望它能夠很容易地拿起相關索引並使用它。 – Kickstart

+0

只試用'customersId'上的索引。或者在'id,customersId'索引中反轉列順序。在SQL實現中,我熟悉複合索引​​中的「子索引」 - 在這種情況下是'customersId' - 不會被自己利用;如'where customersId = 2784'。如果引用該索引的第一列,則清楚地利用該索引。 – radarbob

+0

在這種情況下,MySQL應該使用索引的第一部分。 http://dev.mysql.com/doc/refman/5.7/en/multiple-column-indexes.html – Kickstart

回答

0

得到分區去掉,除非你需要他們的東西。

我們可以創建一個覆蓋索引(索引包含所有需要的列),但它是一個矯枉過正。

而且 -
製作ID的主鍵,並拋出id, customersId (unique)

附:
你爲什麼有createDatecustomersId, createDate (unique)

+0

如果一個表有一個主鍵,那麼分隔鍵必須在主鍵上。如果我讓ID主要,然後我不能partIotion我customersId表。 createDate索引使結果範圍在更小的範圍內。通過這個索引我的查詢是3秒,沒有這個是13秒 –

+1

因此 - 「擺脫分區,除非你需要它們去做別的事情。 –