Ich versuche Vorteile der Partitionierung in Mysql zu testenWarum MySQL-Partitionierung keine Wirkung in meinem Fall hat
Ich habe zwei Tabellen: eine partitionierten andere nicht.
Jede Tabelle enthält 10M Datensätze.
Ich möchte schnelle Abfrage von "user_to_id" Spalte.
partitionierten Tabelle (1024 Teile):
CREATE TABLE `neworder10M_part_byuser` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`site_from_id` int(11) NOT NULL,
`site_to_id` int(11) NOT NULL,
`user_from_id` int(11) NOT NULL,
`user_to_id` int(11) NOT NULL,
`created` datetime NOT NULL,
PRIMARY KEY (`id`,`user_to_id`),
KEY `composite_cover` (`user_to_id`,`user_from_id`,`site_from_id`,`site_to_id`,`created`)
) ENGINE=InnoDB
/*!50100 PARTITION BY HASH (user_to_id)
PARTITIONS 1024 */ |
Tabelle mit Clustered-Schlüssel (nicht partitioniert):
CREATE TABLE `neworder_10M` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`site_from_id` int(11) NOT NULL,
`site_to_id` int(11) NOT NULL,
`user_from_id` int(11) NOT NULL,
`user_to_id` int(11) NOT NULL,
`created` datetime NOT NULL,
PRIMARY KEY (`user_to_id`,`id`),
UNIQUE KEY `id_UQ` (`id`)
) ENGINE=InnoDB;
wenn ich Benchmark beiden Tabellen mit Python-Skript für 1000 reqs:
for i in xrange(1,REQS):
user_id = random.randint(1,10000);
cursor.execute("select * from neworder10M_part_byuser where user_to_id=%s;" % (user_id))
Partitionierte Tabelle: 22 rps Nicht partitioniert: 22.7 rps
Warum hat die partitionierte Tabelle keine Geschwindigkeitsvorteile? Da erwarte ich kleinere Daten - schnellere Abfrage.
Und erklären zeigt auch, dass die Partition:
mysql> explain select * from neworder10M_part_byuser where user_to_id=6867;
+----+-------------+-------------------------+------------+------+-----------------+-----------------+---------+-------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------------------------+------------+------+-----------------+-----------------+---------+-------+------+----------+-------------+
| 1 | SIMPLE | neworder10M_part_byuser | p723 | ref | composite_cover | composite_cover | 4 | const | 1009 | 100.00 | Using index |
+----+-------------+-------------------------+------------+------+-----------------+-----------------+---------+-------+------+----------+-------------+
aber ich reale Geschwindigkeit nicht in der Realität verbessern sehen .... was ich falsch mache?
Tabellen füllen Code:
def send_orders(cur,users=10000,orders=10000000):
for i in xrange(1,orders+1): //10000000 rows here
print i
from_user = random.randint(1,users)
to_user = random.randint(1,users)
from_site = random.randint(1,10000)
to_site = random.randint(1,10000)
cur.execute("INSERT INTO neworder (site_from_id, site_to_id,user_from_id, user_to_id,created) VALUES ('%d','%d','%d','%d',NOW());" % (from_user,to_user,from_site,to_site))
MySQL-Version: Ver 14.14 Distrib 5.7.12, für Linux (x86_64). Festplatte ist SSD.
"Wir würden nicht erwarten, dass es bei den SELECT-Anweisungen zu großen Leistungsunterschieden kommt." Warum? Wie ich durch den Partitionsschlüssel verstehe, ist es möglich, die Partition pXXX für O (1) mal zu bestimmen und dann nur eine bestimmte Partitionsübereinstimmung schneller zu scannen, da ihr Index 10K Zeilen vs. 10M Zeilen von Nicht-Partition-Volldatentabellenindex enthält. Warum sollte der Zeit-Scan-Index für 10K-Zeilen dem Index-Scan für 10M-Zeilen entsprechen? – Evg
Weil es keinen * vollständigen * Scan jedes Indexeintrags macht. Der Index ist so organisiert, dass die Speicher-Engine sehr schnell die Blöcke eingrenzen kann, die die gesuchten Einträge enthalten könnten. Mit dem Index gibt es große Schwaden von Blöcken, in denen die Einträge nicht sein können. So funktionieren Indizes. Bei der Lokalisierung der Einträge spielt es keine Rolle, ob 10.000 Blöcke oder 10.000.000 Blöcke nicht untersucht werden müssen. Aus diesem Grund ist die Leistung gleich. – spencer7593
"Es spielt keine Rolle, ob es 10.000 Blöcke oder 10.000.000 Blöcke gibt, die nicht untersucht werden müssen. Deshalb ist die Leistung die gleiche." I Mysql "Ich denke, das ist eine falsche Aussage. Index verwenden b + Bäume. So Zeitprotokoll (N) Ich teste nur Tabelle für 100K Zeilen und bekomme 1215 rps vs 20 rps auf 10M Zeilen Tabelle.So suche in Partition mit 10K Zeilen shiuldd viel schneller als 100K, und viel mehr dann mit 10M – Evg