Для innodb таблицы в MySQL, который быстрее: varchar (255) или tinytext?

Я согласен, что здесь может быть ошибка. Я изменил реализацию метода добавления объекта> для правильного добавления к NSMutableOrderedSet.

- (void)addSubitemsObject:(SubItem *)value {
     NSMutableOrderedSet* tempSet = [NSMutableOrderedSet orderedSetWithOrderedSet:self.subitems];
     [tempSet addObject:value];
     self.subitems = tempSet;
}

Переназначение набора для self.subitems обеспечит отправку уведомлений Will / DidChangeValue>.

Лилль, вы уверены, что после такой пользовательской настройки значения NSMutableOrderedSet, сохраненные в этом наборе, будут корректно сохранены в базе данных CoreData? Я не проверял это, но похоже, что CoreData ничего не знает о NSOrderedSet и ожидает, что NSSet будет контейнером отношений со многими.

7
задан Andrew Swift 1 July 2009 в 12:15
поделиться

4 ответа

Не верьте, если кто-то скажет вам, что TINYTEXT хранится не так, как VARCHAR.

На самом деле, разница в следующем:

  • TINYTEXT и другие поля TEXT хранятся отдельно от строки в памяти внутри кучи MySQL, в то время как VARCHAR() поля добавляют до 64k лимит (так что вы можете иметь более 64k в TINYTEXT, в то время как с VARCHAR вы не будете иметь более 64k лимит).

  • TINYTEXT и другие 'blob-подобные' поля заставят SQL слой (MySQL) использовать временные таблицы на диске каждый раз, когда они используются, в то время как VARCHAR будет все еще отсортирован 'в памяти' (хотя будет преобразован в CHAR для всей ширины).

  • InnoDB внутренне не заботится о том, крошечный ли это текст или варчар. Это очень легко проверить, создать две таблицы, одну с VARCHAR(255), другую с TINYINT, и вставить запись в обе. Обе они возьмут одну 16k страницу - в то время как при переполнении страниц таблица TINYTEXT должна отображаться как минимум 32k в 'SHOW TABLE STATUS'.

Обычно я предпочитаю VARCHAR(255) - они не вызывают слишком большой фрагментации кучи для одной строки и могут быть обработаны как один 64k объект в памяти внутри MySQL. На InnoDB различия в размере ничтожно малы.

6
ответ дан 7 December 2019 в 05:27
поделиться

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

Причина, по которой это быстрее, в том, что когда MySQL выполняет определенные виды операций (соединения, сортировки и т. Д.), Он часто создает временные таблицы. Когда у вас есть тип BLOB (например, tinytext) во временной таблице, таблица будет основана на диске, а не в памяти, что, конечно, повлияет на производительность.

1
ответ дан 7 December 2019 в 05:27
поделиться

Вы также можете использовать char (255) - хотя он использует больше места, он был значительно быстрее (по моему опыту) использовать поле это постоянный размер при дальнейшем сравнении. Дополнительное пространство можно заполнить заполнением, если вам нужна только скорость, а затем игнорировать пробелы позже.

Однако обратите внимание: MySQL не разрешает типы varchar и char существовать в одной таблице. Также он [обычно] не позволяет сравнивать varchar и char . Я обнаружил это в прошлом году, когда делал реализацию таблицы для хобби проекта .

0
ответ дан 7 December 2019 в 05:27
поделиться

CHAR / VARCHAR будет быстрее, так как эти столбцы хранятся на той же странице, что и данные основной строки *, тогда как типы TEXT хранятся за пределами страницы (я ошибался, см. Комментарий Харрисона).

Раньше люди часто использовали tinytext, потому что varchar (раздражающе) обрезал конечные пробелы. Это поведение было удалено в MySQL 5.0.

(* По крайней мере, для первых 768 байт и со встроенным InnoDB, а не с новым плагином InnoDB).

1
ответ дан 7 December 2019 в 05:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: