Bermuda
Новичок
Как оптимизировать "тяжелый" запрос?
500 000 записей
5 000 000 записей
Нужно посчитать наиболее часто используемые тэги. Запрос занимает много времени, мускул начинает создавать на диске временные таблицы чудовищного размера. В реальном времени такие запросы лучше не делать. Решил сделать скрипт который делает запрос, результат сохраняет в таблиц (своеобразный кэш). Хотел повесить в крон, пусть себе выполняется каждый час. Но запрос в любом случае выполняется долго, почти четыре часа.
Индексы стоят. Как оптимизировать?
PHP:
CREATE TABLE tags_cont (
idcont int(10) unsigned NOT NULL auto_increment,
modulo varchar(255) NOT NULL,
relid int(10) unsigned NOT NULL,
PRIMARY KEY (idcont),
UNIQUE KEY idcont (idcont),
UNIQUE KEY modulo_relid (relid, modulo)
) ENGINE=InnoDB;
PHP:
CREATE TABLE tags_tags (
idtag varchar(255) NOT NULL,
relcont int(10) unsigned NOT NULL,
PRIMARY KEY (idtag, relcont),
KEY idtag (idtag),
KEY relcont (relcont),
CONSTRAINT tags_cont_ibfk_1 FOREIGN KEY (relcont) REFERENCES tags_cont (idcont) ON DELETE CASCADE
) ENGINE=InnoDB;
Нужно посчитать наиболее часто используемые тэги. Запрос занимает много времени, мускул начинает создавать на диске временные таблицы чудовищного размера. В реальном времени такие запросы лучше не делать. Решил сделать скрипт который делает запрос, результат сохраняет в таблиц (своеобразный кэш). Хотел повесить в крон, пусть себе выполняется каждый час. Но запрос в любом случае выполняется долго, почти четыре часа.
PHP:
SELECT idtag, modulo, COUNT(idtag) as contador
FROM tags_tags
LEFT JOIN tags_cont
ON tags_tags.relcont = tags_cont.idcont
GROUP BY idtag, modulo
HAVING contador > 2
LIMIT 100