SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 11.02.2010 11:51:07

DrewBlin
Участник
Зарегистрирован: 29.01.2009
Сообщений: 17

Работа индексов

Есть таблица ААА (порядка 3 млн. записей):
    id int unsigned
    addr int unsigned
    prod int unsigned
На ней существует 2 индекса: (prod, addr) и (prod)

Запрос

select distinct addr
from AAA USE INDEX (prod_addr)
where
    prod IN (много значений)

выполняется за 0.2 секунды

Запрос
select distinct addr
from AAA USE INDEX (prod)
where
    prod IN (много значений)

выполняется за 17 секунд

Выборки возвращают по 2 тысячи записей. Если объем таблицы меньше (сотни тысяч записей) то оба запроса работабт почти одинаково.

Принципиально мне понятно, почему возникает разницаво времени - в первом случае достаточно только индекса чтобы выдать результат.
Во втором - надо еще побегать по таблице, чтобы получить нужне значения.

Сам вопрос: почему такая огромная разница? В моем представлении в индексе хранится адрес записи - остается только перейти на нужный адрес.
Более точно: такая проблема - это особенность MySQL или кривизна настроек? Если второе - то что надо настраивать?

Неактивен

 

#2 11.02.2010 13:27:59

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Работа индексов

В индексе хранится адрес записи, но сама запись находится на диске. Получается 2 тысячи обращений к диску по случайным адресам, что требует многократного перемещения головки. Индекс кэшируется, если включен key_buffer и в этом случае обращение к его значением практически мгновенно.

Неактивен

 

#3 11.02.2010 18:28:16

DrewBlin
Участник
Зарегистрирован: 29.01.2009
Сообщений: 17

Re: Работа индексов

rgbeast написал:

В индексе хранится адрес записи, но сама запись находится на диске. Получается 2 тысячи обращений к диску по случайным адресам, что требует многократного перемещения головки. Индекс кэшируется, если включен key_buffer и в этом случае обращение к его значением практически мгновенно.

Если говорить о том случае, когда запрос выполняется первый раз с момента старта сервера - то данные будут читаться с диска и это будет дольше. Но при повторном выполнении запроса - и данные и индекс уже перенесены в кеш. И к диску обращаться не надо. Отличие по времени между первым и вторым выполнением запроса - около 5 секунд в пользу второго.

Т.е. либо данные не выносятся к кеш (а талица InnoDB) либо что-то все-таки не так.

Неактивен

 

#4 11.02.2010 18:42:18

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Работа индексов

InnoDB хранит в т.ч. и данные в кэше. Поэтому различие есть — нужно поднимать
странички с данными в память, что при втором запросе неверно.

А какой ключ из этих двух primary? И какой смысл во втором ключе, если он не
primary?

Неактивен

 

#5 11.02.2010 23:18:30

DrewBlin
Участник
Зарегистрирован: 29.01.2009
Сообщений: 17

Re: Работа индексов

paulus написал:

InnoDB хранит в т.ч. и данные в кэше. Поэтому различие есть — нужно поднимать странички с данными в память, что при втором запросе неверно.

Не понял изречение... Я понимаю, что первый запрос читает с диска, а второй уже нет. Поэтому второй будет работать быстрее первого. Но второй все равно работает очень долго (17 сек). Т.е. получается, что чтение с диска тут ни при чем.

paulus написал:

А какой ключ из этих двух primary? И какой смысл во втором ключе, если он не
primary?

Первичный ключ вобще по полю id. Смысл второго пока что сводится только к демострации отличия в скорости выполнения работы с первым и со втором.

Изначально был только второй. Но потом оказалось, что приведенный запрос слишком медленно работает. Поэтому был добавлен первый ключ. Но вот желание разобраться в причинах настолько большой разницы остались (а вместе с ним и ключ)

Неактивен

 

#6 12.02.2010 12:16:22

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Работа индексов

Если таблица InnoDB, и ни один из ключей не является primary, то очень
слабо верится в результат. USING INDEX не должен давать такого прироста
производительности.

Запрос, который выполняется за 0.2 секунды — он не из query cache, случаем?

Неактивен

 

#7 12.02.2010 16:48:11

DrewBlin
Участник
Зарегистрирован: 29.01.2009
Сообщений: 17

Re: Работа индексов

paulus написал:

Если таблица InnoDB, и ни один из ключей не является primary, то очень
слабо верится в результат.

Не понял, в результат чего именно не верится?

paulus написал:

USING INDEX не должен давать такого прироста производительности.

Так прирост производительности дает не USING INDEX, а именно индекс, который используется.

paulus написал:

Запрос, который выполняется за 0.2 секунды — он не из query cache, случаем?

Нет. query cache отключен

Неактивен

 

#8 12.02.2010 17:12:56

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Работа индексов

Не верится в то, что результат, когда все данные достаются из индекса при
табличке InnoDB 0.2 секунды, а результат, когда из этой же табличке данные
достаются с использованием других страничек, занимает 17 секунд. Ну то
есть такое представить себе можно (например, весь индекс лежит в памяти,
а данные таки на диске), но обычно так не бывает. Но других мыслей по поводу
разницы производительности все равно нету smile

Неактивен

 

#9 12.02.2010 22:19:36

DrewBlin
Участник
Зарегистрирован: 29.01.2009
Сообщений: 17

Re: Работа индексов

paulus написал:

Не верится в то, что результат, когда все данные достаются из индекса при
табличке InnoDB 0.2 секунды, а результат, когда из этой же табличке данные
достаются с использованием других страничек, занимает 17 секунд. Ну то
есть такое представить себе можно (например, весь индекс лежит в памяти,
а данные таки на диске), но обычно так не бывает. Но других мыслей по поводу
разницы производительности все равно нету smile

Вот и мне не верилось что такое может быть. Пока не получил... В это можно верить или не верить, но оно все равно есть.

Неактивен

 

#10 12.02.2010 22:30:02

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Работа индексов

Все-таки разница между запросами есть. Индексы вторичные и первый запрос использует только индекс, а другой обращается к таблице. Какой размер inndob_buffer_pool_size? Если его увеличить/уменьшить поведение изменится?

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson