Dieser Abschnitt enthält die create
und insert
Anweisungen um die Beispiele aus Kapitel 5, „Daten-Cluster: Die zweite Macht der Indizierung“ in einer MySQL Datenbank durchzuführen.
Index-organisierte Tabellen (Clustered Index)
Im folgenden wird eine zweite SALES
Tabelle mit der InnoDB Engine angelegt. InnoDB verwendet nur Index-organisierte Tabellen. Ein sekundärer Index auf SALE_DATE
wird angelegt.
CREATE TABLE sales_inno (
sale_id NUMERIC NOT NULL,
employee_id NUMERIC NOT NULL,
subsidiary_id NUMERIC NOT NULL,
sale_date DATE NOT NULL,
eur_value NUMERIC(17,2) NOT NULL,
junk CHAR(200),
CONSTRAINT sales_pk
PRIMARY KEY (sale_id)
) Engine=InnoDB;
INSERT INTO sales_inno (sale_id
, subsidiary_id, employee_id
, sale_date, eur_value, junk)
SELECT @row := @row + 1 sale_id
, data.*
FROM (
SELECT e.subsidiary_id, e.employee_id
, CURDATE() - INTERVAL (RAND(0)*3650) DAY sale_date
, TRUNCATE(RAND(1)*99.90+0.1,2) eur_value
, 'junk'
FROM employees e
, ( SELECT generator_4k.n+1 n
FROM generator_4k
WHERE generator_4k.n < 1800
) gen
WHERE MOD(employee_id, 7) = 4
AND gen.n < employee_id / 5
ORDER BY sale_date
) data, (SELECT @row := 0) init
WHERE DAYOFWEEK(sale_date) NOT IN (1,7);
CREATE INDEX sales_inno_dt ON sales_inno (sale_date);
Der Ausführungsplan zeit den Index-Only Scan durch das „Using Index“ an:
EXPLAIN
SELECT sale_id
FROM sales_inno
WHERE sale_date = ?;
+----+------------+------+---------------+------+-------------+
| id | table | type | key | rows | Extra |
+----+------------+------+---------------+------+-------------+
| 1 | sales_inno | ref | sales_inno_dt | 301 | Using index |
+----+------------+------+---------------+------+-------------+