2016-11-29 1 views
1

Wie kann ich meine Abfragezeit verbessern? Ich habe eine Tabelle Geldtransaktionen mit diesen Feldern für das Speichern:Beschleunigen Sie SELECT Abfrage auf große Tabelle

id, customersId, paymentId, amount, cash, createDate 

Meine Anfrage ein Kunden-Transaktionen erhält:

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

Diese Tabelle hat 10 Millionen Datensatz oder mehr. Die Abfrage dauert etwa 13 Sekunden.

Die Tabelle hat diese Indizes:

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

Und diese Partitionen:

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 

Der Server verfügt über 8 GB RAM, mit 3,2 GHz Core i5

ich ausführen möchten diese Abfrage weniger als 0,5 Sekunden

+0

Haben Sie eine EXPLAIN der Abfrage durchgeführt? Hast du OPTIMIZE auf dem Tisch benutzt? Die Abfrage ist ziemlich einfach, also hätte ich erwartet, dass sie den relevanten Index ziemlich leicht aufnimmt und benutzt. – Kickstart

+0

versuchen Sie nur einen Index für 'customsId'. Oder kehren Sie die Spaltenreihenfolge im Index 'id, customesId' um. In einer SQL-Implementierung bin ich vertraut mit dem "Sub-Index" in einem zusammengesetzten Index - in diesem Fall ist das 'customsId '- würde nicht von selbst verwendet werden; wie in 'where customsId = 2784'. Wenn auf die erste Spalte dieses Index verwiesen wird, wurde der Index eindeutig verwendet. – radarbob

+0

In MySQL sollte in diesem Fall der erste Teil des Indexes verwendet werden. http://dev.mysql.com/doc/refman/5.7/en/multiple-column-indexes.html – Kickstart

Antwort

0

Entfernen Sie sich von den Partitionen, es sei denn, Sie benötigen sie für etwas anderes.

Wir können Covering-Index erstellen (Index enthält alle erforderlichen Spalten), aber es ist ein Overkill.

Auch -
Fabrikat Id ein Primärschlüssel und id, customersId (unique)

P. S. werfen
Warum hatten Sie createDate zu ?

+0

Wenn eine Tabelle einen Primärschlüssel hat, dann muss partiotions Schlüssel auf Primärschlüssel. wenn ich id primär mache, kann ich meinen Tisch nicht durch customersId partitionieren. createDate index machen result range in kleineren range.by dieses index meine abfrage ist 3 sek, ohne dies ist 13 sek –

+1

Daher - "loswerden von den partitionen, es sei denn sie sie für etwas anderes brauchen." –

Verwandte Themen