Einzelnen Beitrag anzeigen
  #21  
Alt 03.11.2010, 23:26:38
droehn droehn ist offline
Anfänger
 
Registriert seit: Oct 2010
Alter: 51
Beiträge: 19
AW: COUNT mit JOINs und sub-queries kriechend langsam

Für Interessierte:

Die Performance liess sich nochmal deutlich steigern, indem ich dem COUNT Statement ein LIMIT 0,30 spendierte. Ich kann es mir nicht erklären, welchen Einfluss LIMIT hier nimmt, aber der Query spuckt tatsächlich die korrekte Anzahl von 61'271 Datensätzen aus und wir sind neu bei 2,2 Sekunden.

Anbei der letzte EXPLAIN:
Code:
+----+--------------------+-------+--------+------------------------------------------+-------------------------+---------+--------------------------------------------------+-------+--------------------------+
| id | select_type        | table | type   | possible_keys                            | key                     | key_len | ref                                              | rows  | Extra                    |
+----+--------------------+-------+--------+------------------------------------------+-------------------------+---------+--------------------------------------------------+-------+--------------------------+
|  1 | PRIMARY            | t1    | index  | PRIMARY,deleted,idx_id_deleted           | idx_id_deleted          | 5       | NULL                                             | 61270 | Using where; Using index |
|  1 | PRIMARY            | p11   | ref    | lang,idx_labels_art_lang_del             | idx_labels_art_lang_del | 43      | store_dwh.t1.id,const,const                      |     1 | Using index              |
|  1 | PRIMARY            | p12   | ref    | deleted,idx_art_del_sup                  | idx_art_del_sup         | 5       | const,store_dwh.t1.id                            |     1 | Using where; Using index |
|  1 | PRIMARY            | r20   | eq_ref | PRIMARY,deleted                          | PRIMARY                 | 4       | store_dwh.p12.supplierid                         |     1 |                          |
|  1 | PRIMARY            | p13   | ref    | supplierid,idx_art_sup_val_del           | idx_art_sup_val_del     | 8       | store_dwh.t1.id,store_dwh.r20.id                 |     1 | Using index              |
|  1 | PRIMARY            | p15   | ref    | idx_art_val_del                          | idx_art_val_del         | 5       | const,store_dwh.t1.id                            |     1 | Using index              |
|  3 | DEPENDENT SUBQUERY | p15b  | ref    | validfrom,idx_art_val_del                | idx_art_val_del         | 5       | store_dwh.t1.deleted,store_dwh.p15.artikleid     |     1 | Using where; Using index |
|  2 | DEPENDENT SUBQUERY | p13b  | ref    | supplierid,validfrom,idx_art_sup_val_del | idx_art_sup_val_del     | 8       | store_dwh.p13.artikleid,store_dwh.p13.supplierid |     1 | Using where; Using index |
+----+--------------------+-------+--------+------------------------------------------+-------------------------+---------+--------------------------------------------------+-------+--------------------------+
8 rows in set (0.00 sec)
Der von Thomas vorgeschlagene Weg:

Zitat:
Hast Du schon mal

Code:
$result = mysql_query("SELECT * FROM table1", $link); 
$num_rows = mysql_num_rows($result);
zum Ermitteln der Treffer probiert? Dann entfällt der Vorab-Query mit dem COUNT() komplett und die Blätterfunktion kann problemlos erzeugt werden.
hingegen fällt flach, da hier tatsächlich die durch LIMIT 0,30 eingegrenzte Suche auch nur die Anzahl 30 ausgibt. Ohne Limit wiederum dauerts so lange wie mit COUNT.

Den selben Query als SELECT DISTINCT p15.currid (für die Erzeugung eines Dropdowns mit allen gefundenen unterschiedlichen Währungen) habe ich mit allen möglichen Indizies zu beschleunigen versucht, aber das Problem letztendlich liegt daran, dass trotz neuer Indizies auf p15.currid und/oder mehrere Felder trotzdem einmal durch die ganze Tabelle gelesen werden muss. Dafür sind die Zeiten akzeptabel. Es liegt einfach an der Summe der nacheinander ablaufenden Queries, SELECT, SELECT COUNT und 2-4 Mal SELECT DISTINCT - je nach Anzahl der zu erzeugenden Dropdowns. Ich kann auch ohne Letztere leben.

EXPLAIN für DISTINCT: (neue Indizies wurden vorher wieder entfernt)
Code:
+----+--------------------+-------+--------+------------------------------------------+-------------------------+---------+--------------------------------------------------+-------+-------------------------------------------+
| id | select_type        | table | type   | possible_keys                            | key                     | key_len | ref                                              | rows  | Extra                                     |
+----+--------------------+-------+--------+------------------------------------------+-------------------------+---------+--------------------------------------------------+-------+-------------------------------------------+
|  1 | PRIMARY            | p12   | index  | deleted,idx_art_del_sup                  | idx_art_del_sup         | 9       | NULL                                             | 61271 | Using where; Using index; Using temporary |
|  1 | PRIMARY            | t1    | eq_ref | PRIMARY,deleted,idx_id_deleted           | PRIMARY                 | 4       | store_dwh.p12.artikleid                          |     1 | Using where                               |
|  1 | PRIMARY            | p11   | ref    | lang,idx_labels_art_lang_del             | idx_labels_art_lang_del | 43      | store_dwh.t1.id,const,const                      |     1 | Using index                               |
|  1 | PRIMARY            | r20   | eq_ref | PRIMARY,deleted                          | PRIMARY                 | 4       | store_dwh.p12.supplierid                         |     1 |                                           |
|  1 | PRIMARY            | p13   | ref    | supplierid,idx_art_sup_val_del           | idx_art_sup_val_del     | 8       | store_dwh.t1.id,store_dwh.r20.id                 |     1 | Using index                               |
|  1 | PRIMARY            | p15   | ref    | idx_art_val_del                          | idx_art_val_del         | 5       | const,store_dwh.t1.id                            |     1 |                                           |
|  3 | DEPENDENT SUBQUERY | p15b  | ref    | validfrom,idx_art_val_del                | idx_art_val_del         | 5       | store_dwh.t1.deleted,store_dwh.p15.artikleid     |     1 | Using where; Using index                  |
|  2 | DEPENDENT SUBQUERY | p13b  | ref    | supplierid,validfrom,idx_art_sup_val_del | idx_art_sup_val_del     | 8       | store_dwh.p13.artikleid,store_dwh.p13.supplierid |     1 | Using where; Using index                  |
+----+--------------------+-------+--------+------------------------------------------+-------------------------+---------+--------------------------------------------------+-------+-------------------------------------------+
8 rows in set (0.00 sec)
Grüsse und bis demnäx
David
Mit Zitat antworten