Задавайте вопросы, мы ответим
Вы не зашли.
Есть таблица ААА (порядка 3 млн. записей):
id int unsigned
addr int unsigned
prod int unsigned
На ней существует 2 индекса: (prod, addr) и (prod)
Запрос
Неактивен
В индексе хранится адрес записи, но сама запись находится на диске. Получается 2 тысячи обращений к диску по случайным адресам, что требует многократного перемещения головки. Индекс кэшируется, если включен key_buffer и в этом случае обращение к его значением практически мгновенно.
Неактивен
rgbeast написал:
В индексе хранится адрес записи, но сама запись находится на диске. Получается 2 тысячи обращений к диску по случайным адресам, что требует многократного перемещения головки. Индекс кэшируется, если включен key_buffer и в этом случае обращение к его значением практически мгновенно.
Если говорить о том случае, когда запрос выполняется первый раз с момента старта сервера - то данные будут читаться с диска и это будет дольше. Но при повторном выполнении запроса - и данные и индекс уже перенесены в кеш. И к диску обращаться не надо. Отличие по времени между первым и вторым выполнением запроса - около 5 секунд в пользу второго.
Т.е. либо данные не выносятся к кеш (а талица InnoDB) либо что-то все-таки не так.
Неактивен
InnoDB хранит в т.ч. и данные в кэше. Поэтому различие есть — нужно поднимать
странички с данными в память, что при втором запросе неверно.
А какой ключ из этих двух primary? И какой смысл во втором ключе, если он не
primary?
Неактивен
paulus написал:
InnoDB хранит в т.ч. и данные в кэше. Поэтому различие есть — нужно поднимать странички с данными в память, что при втором запросе неверно.
Не понял изречение... Я понимаю, что первый запрос читает с диска, а второй уже нет. Поэтому второй будет работать быстрее первого. Но второй все равно работает очень долго (17 сек). Т.е. получается, что чтение с диска тут ни при чем.
paulus написал:
А какой ключ из этих двух primary? И какой смысл во втором ключе, если он не
primary?
Первичный ключ вобще по полю id. Смысл второго пока что сводится только к демострации отличия в скорости выполнения работы с первым и со втором.
Изначально был только второй. Но потом оказалось, что приведенный запрос слишком медленно работает. Поэтому был добавлен первый ключ. Но вот желание разобраться в причинах настолько большой разницы остались (а вместе с ним и ключ)
Неактивен
Если таблица InnoDB, и ни один из ключей не является primary, то очень
слабо верится в результат. USING INDEX не должен давать такого прироста
производительности.
Запрос, который выполняется за 0.2 секунды — он не из query cache, случаем?
Неактивен
paulus написал:
Если таблица InnoDB, и ни один из ключей не является primary, то очень
слабо верится в результат.
Не понял, в результат чего именно не верится?
paulus написал:
USING INDEX не должен давать такого прироста производительности.
Так прирост производительности дает не USING INDEX, а именно индекс, который используется.
paulus написал:
Запрос, который выполняется за 0.2 секунды — он не из query cache, случаем?
Нет. query cache отключен
Неактивен
Не верится в то, что результат, когда все данные достаются из индекса при
табличке InnoDB 0.2 секунды, а результат, когда из этой же табличке данные
достаются с использованием других страничек, занимает 17 секунд. Ну то
есть такое представить себе можно (например, весь индекс лежит в памяти,
а данные таки на диске), но обычно так не бывает. Но других мыслей по поводу
разницы производительности все равно нету
Неактивен
paulus написал:
Не верится в то, что результат, когда все данные достаются из индекса при
табличке InnoDB 0.2 секунды, а результат, когда из этой же табличке данные
достаются с использованием других страничек, занимает 17 секунд. Ну то
есть такое представить себе можно (например, весь индекс лежит в памяти,
а данные таки на диске), но обычно так не бывает. Но других мыслей по поводу
разницы производительности все равно нету
Вот и мне не верилось что такое может быть. Пока не получил... В это можно верить или не верить, но оно все равно есть.
Неактивен
Все-таки разница между запросами есть. Индексы вторичные и первый запрос использует только индекс, а другой обращается к таблице. Какой размер inndob_buffer_pool_size? Если его увеличить/уменьшить поведение изменится?
Неактивен