Met behulp van een index heb ik een zeer trage query zeer snel weten te krijgen. Ik heb me vervolgens verder verdiept in indices, maar ik heb nog wel wat vragen. Het gaat om MySQL 5.1.
Als voorbeeld gebruik ik de tabel 'content_file':
1. Is hier sprake van duplicate of redundant indices?
Volgens mij alleen PRIMARY en id omdat ik bij het maken van de tabel id zowel als primary als unique key heb gedefiniëerd. Ik dacht dat dit zo moest, maar volgens http://www.mysqlperforman...es-and-redundant-indexes/ moet dat niet.
Moet ik UNIQUE achterwege laten bij primary-keys?
2. Vervolg op de eerste vraag: Stel ik heb unieke velden, maar het is geen noodzaak om er een index van te maken. Kan ik dat aangeven? Unique wordt namelijk altijd ook een index.
Stel ik heb een tabel met de velden ID en naam. ID is primary key, op naam zelf wordt nooit gezocht maar het is wel een veld dat altijd uniek moet zijn. Als ik "UNIQUE KEY naam" toevoeg aan de definitie, dan wordt naam ook een index, terwijl dat niet nodig is. Wat is een goede werkwijze? Geen uniek constraint definieren?
3. Naamgeving: Index hebben een naam (keyname). Als ik zelf een index maak, maakt het dan wat uit welke naam ik toeken? Of is dat alleen voor index-hinting?
4. Op de bovenstaande voorbeeld-tabel "content_file" worden gegevens opgehaald op basis van content_id en de combinatie content_id, res_x en res_y.
Queries in de vorm van:
SELECT * FROM content_file WHERE content_id=?
of
SELECT * FROM content_file WHERE content_id=? AND res_x<? AND res_x>? AND res_y<? AND res_y>?
Welke indices zijn hier nodig? De indices die ik in het voorbeeld noem?
Kan voor die tweede query ook volstaan worden met drie afzonderlijke indices content_id, res_x en res_y of moeten ze samen in één index?
Stel je hebt een index met de kolommen "content_id, res_x, res_y" zoals ook in dit voorbeeld, is dan nog een afzonderlijke index "content_id" nodig voor de eerste query?
Gaat die tweede query automatisch de index "content_id, res_x, res_y" gebruiken? Ik heb de keyname "content_id_res_x_res_y" gebruikt. Heeft dat nog invloed? Is hier hinting nodig?
Als voorbeeld gebruik ik de tabel 'content_file':
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
| Gemaakt met: CREATE TABLE content_file ( id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, content_id INTEGER UNSIGNED NOT NULL REFERENCES content(id), filename VARCHAR(127) NOT NULL, res_x SMALLINT UNSIGNED NOT NULL, res_y SMALLINT UNSIGNED NOT NULL, secure SMALLINT UNSIGNED NOT NULL, PRIMARY KEY (id), UNIQUE KEY (id) ); Later nog indices toegevoegd. mysql> explain content_file; +------------+----------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+----------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | content_id | int(10) unsigned | NO | MUL | NULL | | | filename | varchar(127) | NO | | NULL | | | res_x | smallint(5) unsigned | NO | | NULL | | | res_y | smallint(5) unsigned | NO | | NULL | | | secure | smallint(5) unsigned | NO | | NULL | | +------------+----------------------+------+-----+---------+----------------+ 6 rows in set (0.00 sec) mysql> show index from content_file; +--------------+------------+------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | +--------------+------------+------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ | content_file | 0 | PRIMARY | 1 | id | A | 15224 | NULL | NULL | | BTREE | | | content_file | 0 | id | 1 | id | A | 15224 | NULL | NULL | | BTREE | | | content_file | 1 | content_id | 1 | content_id | A | 7612 | NULL | NULL | | BTREE | | | content_file | 1 | content_id_res_x_res_y | 1 | content_id | A | 7612 | NULL | NULL | | BTREE | | | content_file | 1 | content_id_res_x_res_y | 2 | res_x | A | 15224 | NULL | NULL | | BTREE | | | content_file | 1 | content_id_res_x_res_y | 3 | res_y | A | 15224 | NULL | NULL | | BTREE | | +--------------+------------+------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+--------- |
1. Is hier sprake van duplicate of redundant indices?
Volgens mij alleen PRIMARY en id omdat ik bij het maken van de tabel id zowel als primary als unique key heb gedefiniëerd. Ik dacht dat dit zo moest, maar volgens http://www.mysqlperforman...es-and-redundant-indexes/ moet dat niet.
Moet ik UNIQUE achterwege laten bij primary-keys?
2. Vervolg op de eerste vraag: Stel ik heb unieke velden, maar het is geen noodzaak om er een index van te maken. Kan ik dat aangeven? Unique wordt namelijk altijd ook een index.
Stel ik heb een tabel met de velden ID en naam. ID is primary key, op naam zelf wordt nooit gezocht maar het is wel een veld dat altijd uniek moet zijn. Als ik "UNIQUE KEY naam" toevoeg aan de definitie, dan wordt naam ook een index, terwijl dat niet nodig is. Wat is een goede werkwijze? Geen uniek constraint definieren?
3. Naamgeving: Index hebben een naam (keyname). Als ik zelf een index maak, maakt het dan wat uit welke naam ik toeken? Of is dat alleen voor index-hinting?
4. Op de bovenstaande voorbeeld-tabel "content_file" worden gegevens opgehaald op basis van content_id en de combinatie content_id, res_x en res_y.
Queries in de vorm van:
SELECT * FROM content_file WHERE content_id=?
of
SELECT * FROM content_file WHERE content_id=? AND res_x<? AND res_x>? AND res_y<? AND res_y>?
Welke indices zijn hier nodig? De indices die ik in het voorbeeld noem?
Kan voor die tweede query ook volstaan worden met drie afzonderlijke indices content_id, res_x en res_y of moeten ze samen in één index?
Stel je hebt een index met de kolommen "content_id, res_x, res_y" zoals ook in dit voorbeeld, is dan nog een afzonderlijke index "content_id" nodig voor de eerste query?
Gaat die tweede query automatisch de index "content_id, res_x, res_y" gebruiken? Ik heb de keyname "content_id_res_x_res_y" gebruikt. Heeft dat nog invloed? Is hier hinting nodig?