2016-04-25 6 views
0

Werfen Sie einen Blick auf diese sqlfiddle ich gemacht http://sqlfiddle.com/#!9/4b903/2/0. Dies ist die vereinfachte Version meiner Datenbank. Ich habe jetzt eine Million Datensätze in der Geschichte und das Problem ist, dass die Abfrage zu langsam scheint. Manchmal dauert es eine Minute, um das Ergebnis zu erhalten. Ich bin nicht wirklich gut in diesem SQL-Zeug. Ich denke da sind einige Spalten, die ich indizieren muss, aber ich bin mir nicht sicher, was das sind.Brauchen Sie Hilfe bei der Verbesserung der Leistung der SQL-Abfrage

Update:

ich versuchte SQL

 

id | select_type  | table | type | possible_keys          | key    | key_len | ref   | rows | Extra 
1 | PRIMARY   | t1 | range | created_reason,created_reason_2      | created_reason_2 | 6  | NULL   | 91136 | Using where; Using temporary; Using filesort 
2 | DEPENDENT SUBQUERY | t2 | ref | history_table1_id_foreign,table1_id,table1_id_2  | table1_id_2  | 4  | t1.table1_id | 11 | Using where; Using index; Using filesort 
 
+0

Indizes erstellen. https://dev.mysql.com/doc/refman/5.6/en/optimization-indexes.html – hjpotter92

+0

Übrigens Geld ist in der Regel DECIMAL, nicht FLOAT – Strawberry

+0

Außerdem verwenden Sie eine korrelierte Unterabfrage. Ein unmarkierter ist fast immer schneller. – Strawberry

Antwort

0

Das erste, was Sie den Clustered-Index erstellen können für folgende Spalten (id, table1_id, created_reason , created_at timestamp, updated_at timestamp, deleted_at` Zeitstempel) zu erklären;

Dann anstelle von Unterabfrage diese Ergebnismenge in temporäre Tabelle und versuchen, mit dieser temporären Tabelle und Haupttabelle zu verbinden.

1

Sie haben keine Indizes für eine der Spalten erstellt. Bitte lesen Sie über lineare und binäre Suchen, bevor Sie schwere Abfragen schreiben.

Indizes hinzufügen

alter table `test_delete`.`table1` 
add index `idx_created_at` (`created_at` asc), 
add index `idx_price` (`price` asc); 

hinzufügen Indizes Geschichte tabelle1

alter table `test_delete`.`history` 
add index `idx_history_created_at` (`created_at` asc), 
add index `idx_history_price` (`price` asc), 
add index `idx_table1_id` (`table1_id` asc); 

Eine kleine Änderung - haben nicht viel Wirkung

select t1.* from history t1 where t1.created_at >= '2016-03-13 00:00:00' 
and t1.created_reason = 'Scraped' 
and t1.price not in (-1, (
     select t2.price 
      from history t2 
      where t2.table1_id = t1.table1_id 
      and t2.created_at < t1.created_at 
      and t2.created_at > t1.created_at + interval -30 day 
      and t2.price > -1 
      order by t2.created_at desc 
      limit 1 
     )) 
group by t1.table1_id; 
Verwandte Themen