Ik heb de volgende database
Ik heb de volgende tabellen
Advertisements (50.000 records)
Brands (25 records)
Join tabel (Advertisements has and belongs to many Brands) (iets meer dan 50.000 records)
De meeste advertenties hebben 1 brand. Een enkele advertentie heeft 2 brands
De server is MySQL 5.1 met innoDB
Deze query is prima te doen (Zoeken hoeveel brands horen bij advertentie 1):
Deze query is super traag (Zoeken hoeveel advertenties horen bij brand 1):
M.a.w. alle brands bij een advertentie zoeken gaat supersnel. Alle advertenties bij een brand zoeken duurt een eeuwigheid.
Volgens mij is wat ik wil een heel simpel probleem. Ik wil een index op brands die per brand alle bijbehorende advertenties bijhoud.
Ik dacht het op te lossen met de volgende index:
Ik heb ook een unique index geprobeerdf en precies de omgekeerde index (advertisement_id, brand_id), maar geen van alle werkt.
Ik heb niet zo heel veel kennis van indexes en weet niet precies waar ik het zoeken moet. Mijn gevoel zegt dat ik gewoon de verkeerde index aan het definieren ben. Wie kan mij uitleggen wat ik fout doe?
Ik heb de volgende tabellen
Advertisements (50.000 records)
code:
1
2
3
4
5
6
| +-----------------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(255) | YES | | NULL | | +-----------------------+--------------+------+-----+---------+----------------+ |
Brands (25 records)
code:
1
2
3
4
5
6
| +------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(255) | YES | | NULL | | +------------+--------------+------+-----+---------+----------------+ |
Join tabel (Advertisements has and belongs to many Brands) (iets meer dan 50.000 records)
code:
1
2
3
4
5
6
| +------------------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------------+---------+------+-----+---------+-------+ | advertisement_id | int(11) | YES | MUL | NULL | | | brand_id | int(11) | YES | MUL | NULL | | +------------------+---------+------+-----+---------+-------+ |
De meeste advertenties hebben 1 brand. Een enkele advertentie heeft 2 brands
De server is MySQL 5.1 met innoDB
Deze query is prima te doen (Zoeken hoeveel brands horen bij advertentie 1):
code:
1
2
3
| Load (0.8ms) SELECT count(*) FROM `brands` INNER JOIN `advertisements_brands` ON `brands`.`id` = `advertisements_brands`.`brand_id` WHERE `advertisements_brands`.`advertisement_id` = 1 |
Deze query is super traag (Zoeken hoeveel advertenties horen bij brand 1):
code:
1
2
3
| (195.9ms) SELECT COUNT(*) FROM `advertisements` INNER JOIN `advertisements_brands` ON `advertisements`.`id` = `advertisements_brands`.`advertisement_id` WHERE `advertisements_brands`.`brand_id` = 1 |
M.a.w. alle brands bij een advertentie zoeken gaat supersnel. Alle advertenties bij een brand zoeken duurt een eeuwigheid.
Volgens mij is wat ik wil een heel simpel probleem. Ik wil een index op brands die per brand alle bijbehorende advertenties bijhoud.
Ik dacht het op te lossen met de volgende index:
code:
1
2
| CREATE INDEX index_advertisements_brands_on_brand_id_and_advertisement_id ON advertisements_brands(brand_id, advertisement_id) |
Ik heb ook een unique index geprobeerdf en precies de omgekeerde index (advertisement_id, brand_id), maar geen van alle werkt.
Ik heb niet zo heel veel kennis van indexes en weet niet precies waar ik het zoeken moet. Mijn gevoel zegt dat ik gewoon de verkeerde index aan het definieren ben. Wie kan mij uitleggen wat ik fout doe?
edit:
of is dit wel de goede index en moet ik even geduld hebben om de server zijn index te laten opbouwen voordat het effect heeft?
of is dit wel de goede index en moet ik even geduld hebben om de server zijn index te laten opbouwen voordat het effect heeft?
[ Voor 33% gewijzigd door van.der.schulting op 22-10-2011 01:27 ]