Große Datenbanken - Designproblem

Mahlzeit ...

Ich stehe gerade vor dem Problem ein Datenbankdesign für eine relativ umfangreiche Datenmenge zu erstellen.
Genauer gesagt handelt es sich um genau 10 Millionen Datensätze mit der folgenden Struktur einer "flat table".

Code:
mysql> desc test_tab;
+--------------+------------+------+-----+---------+----------------+
| Field        | Type       | Null | Key | Default | Extra          |
+--------------+------------+------+-----+---------+----------------+
| id           | int(11)    | NO   | PRI | NULL    | auto_increment |
| first        | char(13)   | NO   | MUL | NULL    |                |
| second       | char(12)   | NO   | MUL | NULL    |                |
| third        | char(11)   | NO   | MUL | NULL    |                |
| attribute1   | tinyint(1) | NO   | MUL | 0       |                |
| attribute2   | tinyint(1) | NO   |     | 0       |                |
| attribute3   | tinyint(1) | NO   |     | 0       |                |
| attribute4   | datetime   | YES  | MUL | NULL    |                |
+--------------+------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)


Auf allen Feldern liegen Keys. Die Tabelle wurde mit Testdatensätzen gefüllt, wobei die Attributfelder zufällig auf 0 oder 1 gesetzt wurden, um eine maximale Ausschöpfung der Daten im Endstadium zu simulieren.
Es handelt sich z.B. um folgendes SELECT Statement.

SQL:
SELECT second, count(first) as anz FROM test_tab WHERE attribute1 = 0 AND attribute2 = 0 GROUP BY second HAVING anz % 10  = 0 LIMIT 50;

Momentan dauert das Statement auf einer "schwächeren" Kiste, ca. 15 Sekunden.
Ich suche nach Wegen, Feedback oder Alternativen um eine Query zu beschleunigen!?


Danke & Gruß,
Luke
 
15 Sekunden bei 10 Millionen Datensätzen und dieser Query schon i.O.

Was du machen könntest ist die Datenbank tables sinvoll zu partitionieren.
 
Auf allen Feldern liegen Keys. Die Tabelle wurde mit Testdatensätzen gefüllt, wobei die Attributfelder zufällig auf 0 oder 1 gesetzt wurden, um eine maximale Ausschöpfung der Daten im Endstadium zu simulieren.
Es handelt sich z.B. um folgendes SELECT Statement.

SQL:
SELECT second, count(first) as anz FROM test_tab WHERE attribute1 = 0 AND attribute2 = 0 GROUP BY second HAVING anz % 10  = 0 LIMIT 50;

In dem Fall hilft es relativ wenig einzelne Indizes pro Spalte anzulegen. Ein Index über die benötigten Felder in der richtigen Reihenfolge hilft da deutlich mehr.
Code:
CREATE INDEX attr_combined ON test_tab (attribute1,attribute2,second)
 

Zurück
Oben