В чем проблема с этим запросом? Загрузка данных из таблицы mysql с более чем 220 000 записей занимает от 0,5 до 0,6 секунд. - PullRequest
0 голосов
/ 30 апреля 2018

В чем проблема с этим запросом? Загрузка данных из таблицы mysql с более чем 220 000 записей занимает от 0,5 до 0,6 секунд

SELECT correct 
FROM  `answers` 
WHERE  `assignment_id` =2055
AND (
`correct` =  'N' ||  'NA'
)
AND  `topic_id` =  '50#j1_5'
AND  `student_id` 
IN ( 702, 223, 237, 252, 229, 246, 1050, 256, 248, 1049, 243, 241, 244, 242, 249, 236, 250, 245 ) 
LIMIT 0 , 30

Любые руки помощи, как получить данные быстрее? См. Результат объяснения

Ответы [ 2 ]

0 голосов
/ 10 мая 2018
correct = 'N' ||  'NA'

Что это должно означать?

correct = CONCAT('N', 'NA')
correct = 'N' OR correct = 'NA'

Ну, это не значит ни то, ни другое.

Чтобы работать быстрее, добавьте этот составной индекс:

INDEX(assignment_id, topic_id, correct, student_id)

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

Кардинальность не имеет значения.

Числовое и строковое значения - не имеет значения в индексах.

0 голосов
/ 30 апреля 2018

Это не полный ответ (по крайней мере, на данный момент), но слишком большой, чтобы быть комментарием.

Вы можете добавить индекс к таблице. Синтаксис для этого здесь: -

https://dev.mysql.com/doc/refman/8.0/en/create-index.html

Я бы предположил , что индекс столбцов assignment_id и student_id, вероятно, поможет больше всего.

ALTER TABLE `answers` ADD INDEX `assignment_id_student_id` (`assignment_id`, `student_id`);

Это может занять некоторое время (т. Ч., Вероятно, не в этой ситуации, но что-то, о чем следует знать с большими / более сложными индексами).

Обратите внимание, что MySQL в целом будет использовать один индекс для таблицы, а не объединять индексы. Следовательно, вы устанавливаете индекс, который охватывает более одного столбца.

...