Индекс в таблице

voituk

прозревший
Индекс в таблице

У меня в каждой таблице есть неключевое поле `sort`.
При любом SELECT или UPDATE запросе у меня выполняется "ORDER BY sort".
Стоит ли делать поле `sort` индексом?
Даст ли это прирост в скорости выполнения запросов?
 

voituk

прозревший
Зачем нужны индексы - для индексирования данных для последующего более быстрого поиска. /прям как в школе:) /

Я вот подумал что сортировка то будет идти НЕ 'Using filesort', а потому это может снизить скорость выполнения запроса.
Или я не прав?
 

camka

не самка
В некоторых случаях MySQL может использовать индекс, чтобы выполнить запрос ORDER BY или GROUP BY без выполнения дополнительной сортировки.

Индекс может также использоваться и тогда, когда предложение ORDER BY не соответствует индексу в точности, если все неиспользуемые части индекса и все столбцы, не указанные в ORDER BY - константы в выражении WHERE. Следующие запросы будут использовать индекс, чтобы выполнить ORDER BY / GROUP BY.

SELECT * FROM t1 ORDER BY key_part1,key_part2,...
SELECT * FROM t1 WHERE key_part1=constant ORDER BY key_part2
SELECT * FROM t1 WHERE key_part1=constant GROUP BY key_part2
SELECT * FROM t1 ORDER BY key_part1 DESC,key_part2 DESC
SELECT * FROM t1 WHERE key_part1=1 ORDER BY key_part1 DESC,key_part2 DESC

(c) manual
 

Falc

Новичок
voituk
>>При любом SELECT или UPDATE запросе у меня выполняется "ORDER BY sort".

Интересно а зачем у тебя в апдейте ORDER BY?
 

voituk

прозревший
Интересно а зачем у тебя в апдейте ORDER BY?
Чтобы задать в каком порядке будут обрабатываться записи.
Например в таком случае сохраняется старый порядок сортировки, но поле sort перенумеровывается

BEGIN;
SELECT @a:=0;
UPDATE table SET sort=(@a:=@a+1) ORDER BY sort;
COMMIT;

-~{}~ 26.07.04 18:05:

судя по всему вопрос решен - буду создавать индекс для поля `sort`
 

Falc

Новичок
voituk
>>SELECT @a:=0;
>>UPDATE table SET sort=(@a:=@a+1) ORDER BY sort;

Подобные запросы индекс на sort только замедлит :)
 

Profic

just Profic (PHP5 BetaTeam)
voituk
а чем это ПРИНЦИПИАЛЬНО отличается от
UPDATE table SET sort=sort+1;
 

Falc

Новичок
Profic

Это разные запросы.

Первый пересортировывает записи, а твой просто прибавляет 1 к полю сорт.
 

voituk

прозревший
Подобные запросы индекс на sort только замедлит :)
ну это ясно, потому как будет пересоздаваться индекс.
Но update будет выполняться ОЧЕНЬ редко, меня больше интерисует скорость работы на SELECT
 

Falc

Новичок
voituk
А ты выборки делаешь сразу всей таблицы или некоторые условия накладываешь?
 

voituk

прозревший
Originally posted by Falc
voituk
А ты выборки делаешь сразу всей таблицы или некоторые условия накладываешь?
Накладываю условие WHERE, причём чаще всего по ключевому полю.
 

Falc

Новичок
voituk
>>Накладываю условие WHERE, причём чаще всего по ключевому полю.

Тогда индекс по сорт тебе не поможет, тебе надо делать составной индекс. А вообще если where бывает разным, то лучше индекс вообще не делать.
 

voituk

прозревший
Originally posted by Falc
Тогда индекс по сорт тебе не поможет, тебе надо делать составной индекс. А вообще если where бывает разным, то лучше индекс вообще не делать.
Сорри немного оговорился:
WHERE делаю чаще всего по индексному полю.

В каком смысле "надо делать составной индекс".
Составной по чём?
У меня чаще всего идёт запрос вида
... WHERE index_filed1=10 AND index_field2=20
или же только по одному индексированному полю.
В данном случае я понимаю что делать составной индекс бессмысленно так как возможны и запросы по одному полю.

-~{}~ 26.07.04 23:21:

Originally posted by lucas
Простите меня, неразумного, но разве (по стандарту) это должно выполняться не SET'ом?
Чесно говоря не знаю - взял из примера в MySQL Manual.
Даже имя переменной не соизволил поменять. ;)
 

Falc

Новичок
voituk
>>WHERE index_filed1=10 AND index_field2=20

Вот тебе и надо делать составной индекс по этим полям, причем первым должно быть то поле, которое встречается в запросах с условием по одному полю.
А индекс на sort в твоих запросах никакого прироста не даст.
 

voituk

прозревший
Originally posted by Falc
voituk
>>WHERE index_filed1=10 AND index_field2=20

Вот тебе и надо делать составной индекс по этим полям, причем первым должно быть то поле, которое встречается в запросах с условием по одному полю.
А индекс на sort в твоих запросах никакого прироста не даст.
Понял. Всем спасибо за помощь.
 
Сверху