Медленно выбирает столбцы с переменной длиной в таблице InnoDB?

StackOverflow https://stackoverflow.com/questions/5809238

Вопрос

С Myisam, имеющими столбцы переменной длины (Varchar, Blob) в таблице, действительно замедляли запросы, так что я столкнулся с советами в сети, чтобы перемещать столбцы Varchar в отдельную таблицу.

Это все еще проблема с Innodb? Я не имею в виду случаи, когда введение многих рядов Varchar в таблице вызывает разделение страницы. Я просто имею в виду, если вы, например, рассмотреть, например, переместить post_text (поле для одиночной капли в таблице) в другую таблицу, говоря о производительности о Innodb?

Это было полезно?

Решение

Насколько я знаю, капли (и тексты) фактически хранятся за пределами таблицы, в таблице хранятся Varchars.

Varchars вредны для выполнения чтения, потому что каждая запись может иметь переменную длину, и это делает более дорогостоящим поиском поля в записи. Капли медленны, потому что значение должно быть извлечено отдельно, и, скорее всего, потребуется другое чтение с диска или кэша.

Насколько мне известно, Innodb не делает ничего по -другому в этом отношении, поэтому я бы предположил, что характеристики производительности сохраняются.

Я не думаю, что движущиеся значения Blob действительно помогают - кроме сокращения общего размера таблицы, что оказывает положительное влияние на производительность независимо. Varchars - это другая история. Вы определенно выиграете здесь. Если все ваши столбцы имеют определенную длину (и я думаю, это означает, что вы тоже не можете использовать капли?), Поиск поля будет быстрее.

Если вы просто «читаете» поля Varhcar и Blob, я бы сказал, что это стоит. Но если ваш запрос Select должен сравнить значение из варчара или капли, вы довольно кислые.

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

Пса

Другим способом «оптимизации» производительности чтения Varchar является просто заменить их на поля CHAR (фиксированной длины). Это может помочь чтению производительности, пока увеличение дискового пространства является приемлемым.

Другие советы

Данные Innodb совершенно не так, как Myisam.

В Myisam все индексы-Primary или иначе --- хранятся в файле MYI. Содержит указатель на данные, хранящиеся в файле MYD. Ряды переменной длины не должны непосредственно влиять на скорость запроса напрямую, но файл MYD имеет тенденцию к более фрагментированным с помощью рядов переменной длины, потому что отверстие, оставленное позади, когда вы удаляете строку, не обязательно будет подано в строку, которую вы вставляете дальше. Если вы обновите значение переменной длины, чтобы сделать его дольше, вам, возможно, придется переместить его куда-нибудь еще, что означает, что оно будет иметь тенденцию выходить из строя в отношении индексов с течением времени, что делает запросы диапазона медленнее. (Если вы управляете его на вращающемся диске, где важно время поиска).

InnoDB сохраняет данные, сгруппированные на страницах в B-дереве на первичном ключе. До тех пор, пока данные поместятся на странице, они хранятся на странице, независимо от того, используете ли вы Blob или Varchar. Пока вы не пытаетесь регулярно вставлять необычно длинные значения, не должно иметь значения, являются ли ваши строки фиксированной длиной или переменной длины.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top