Добрый день,есть простинький запрос и большая таблица:
select * from t1 where id=4 and time>1 and time<100на такой запрос explain пишет
type: ref
possible_keys: id,time
key: idесли убрать из запроса id то получим
select * from t1 where time>1 and time<100
type: range
possible_keys: time
key: timeТ.е. в первом случае он не использует индекс по столбцу time
и переберает все значения с id=4. Как правильно составить запрос
и проиндексировать таблицу? Поможет ли создание индекса по 2-м столбцам?
Таблица очень большая, и постоянно используется
поэксперементировать не получается :(
>Добрый день,
>
>есть простинький запрос и большая таблица:
>select * from t1 where id=4 and time>1 and time<100
>
>на такой запрос explain пишет
>type: ref
>possible_keys: id,time
>key: id
>
>если убрать из запроса id то получим
>select * from t1 where time>1 and time<100
>type: range
>possible_keys: time
>key: time
>
>Т.е. в первом случае он не использует индекс по столбцу time
>и переберает все значения с id=4. Как правильно составить запрос
>и проиндексировать таблицу? Поможет ли создание индекса по 2-м столбцам?
>Таблица очень большая, и постоянно используется
>поэксперементировать не получается :(Поскольку не приведена информация о полях таблицы, приходится только догадываться. Рискну предположить, что id - первичный ключ, и в этом случае из всех равных ключей будет использоваться именно он. Для указания, какой ключ лучше использовать, или не использовать можно использовать USE INDEX(time) или IGNORE INDEX(id) соответсвенно после select * from t1.
CREATE TABLE t1 (
id int(11) not null,
time int UNSIGNED default '0',
KEY id (id),
KEY time (time)
) TYPE=InnoDB;Уникальных и первичных ключей нет.
попробовал добавить USE INDEX(time) тогда он перестает использовать индекс id
если написать USE INDEX(id,time) то использует _только_ индекс id
>CREATE TABLE t1 (
>id int(11) not null,
>time int UNSIGNED default '0',
>KEY id (id),
>KEY time (time)
>) TYPE=InnoDB;
>
>Уникальных и первичных ключей нет.
>попробовал добавить USE INDEX(time) тогда он перестает использовать индекс id
>если написать USE INDEX(id,time) то использует _только_ индекс idТогда вообще надо было делать не так. Если time совместно с id должен образоывать уникальный ключ (по идее должна быть какая-то соввокупность полей, которая может обеспечить уникальность строки):
CREATE TABLE t1 (
id int(11) not null,
time int UNSIGNED NOT NULL default '0', -- здесь not null - требование PK
PRIMARY KEY (time, id),
KEY id (id)
) TYPE=InnoDB;
>Тогда вообще надо было делать не так. Если time совместно с id
>должен образоывать уникальный ключ (по идее должна быть какая-то соввокупность полей,
>которая может обеспечить уникальность строки):
>
>CREATE TABLE t1 (
>id int(11) not null,
>time int UNSIGNED NOT NULL default '0', -- здесь not null -
>требование PK
>PRIMARY KEY (time, id),
>KEY id (id)
>) TYPE=InnoDB;Хинт: как ты вообще представляешь себе использование сразу двух ключей в одном запросе?
>
>Хинт: как ты вообще представляешь себе использование сразу двух ключей в одном
>запросе?/me почесал репу
Действительно тупанул...