запрос: SELECT * FROM messages WHERE topic_id = 62365;
в этой таблице 4.5 млн записей, есть индекс на topic_id. По запросу возвращается порядка 128к записей. Если сделать EXPLAIN, то показывается, что индекс взялся, но в столбце rows показывается что оно обошло 233к строк. Как такое может быть? Например, если взять по другому topic_id, то будет кейс, когда вернется 37 записей, и в explain в rows тоже будет 37. А в случаях где начинается более 10к записей, оно будто бы обходит два раза. С чем это связано?
+ дополнительный вопрос, в этой таблице есть составной индекс, на topic_id и еще колонку, и есть индекс именно на topic_id. В этом случае оно берет почему-то составной индекс. Разве оно не должно взять индекс который накинут именно на topic_id? Да, если указать FORCE INDEX по одиночному индексу, то оно показывает что оно еще больше строк захватывает
Значения rows в выводе EXPLAIN по определению неточные - это оценка, исходя из статистики.
Если mysql достаточно свежий, можно сделать EXPLAIN ANALYZE - тогда запрос будет реально выполнен и покажет реальные значения для rows.
Если EXPLAIN сильно ошибается с оценками, стоит сделать ANALYZE TABLE и, возможно, поиграться с настройками статистики для таблицы (UPDATE HISTOGRAM)