Какой вариант быстрее составной primary или AUTO_INCREMENT + составной UNIQUE INDEX?
Данные (кол. записей):
product ~ 100К
product_rel ~ 3M
Запросы:
INSERT, UPDATE - отсутствуют
Обычно выполняются, запросы типа:
SELECT p.*,pr.rating
FROM product_rel pr
JOIN product p ON(pr.product_id_2 = p.id)
WHERE pr.product_id_1 = 12345
ORDER BY pr.rating
Какой вариант лучше(быстрее) при запросах(SELECT), и какой тип БД (MYISAM,INNODB) выбрать
CREATE TABLE product_rel(
product_id_1 MEDIUMINT(9) UNSIGNED NOT NULL DEFAULT 0,
product_id_2 MEDIUMINT(9) UNSIGNED NOT NULL DEFAULT 0,
rating FLOAT(9, 9) UNSIGNED NOT NULL DEFAULT 0.000000000,
PRIMARY KEY (product_id_1, product_id_2),
INDEX IX_product_rel_product_id_2 (product_id_2)
)
или
CREATE TABLE product_rel(
id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
product_id_1 MEDIUMINT(9) UNSIGNED NOT NULL DEFAULT 0,
product_id_2 MEDIUMINT(9) UNSIGNED NOT NULL DEFAULT 0,
rating FLOAT(9, 9) UNSIGNED NOT NULL DEFAULT 0.000000000,
PRIMARY KEY (id),
UNIQUE INDEX UK_product_rel (product_id_1, product_id_2),
INDEX IX_product_rel_product_id_2 (product_id_2)
)
Второй вариант гипотетически будет незначительно быстрее, но выбирать стОит из соображений бизнес-логики - где во вне БД будут использоваться ключи таблицы? Делайте как удобнее, не задумываясь о скорости. Либо протестируйте скорость, если считаете, что это будет узким местом в системе.
(Судя по всему, это таблица по смыслу что-то типа "с этим продуктом также покупают...", я бы для такого использовал первый вариант, не заморачиваясь с отдельным ID.)