2017-01-22 5 views
0

У меня есть таблица содержит текст и поле блоба и некоторые другие, мне интересно, если с помощью такого рода типов данных, замедлят доступ к таблицели текст или BLOB поля замедляют доступ к таблице

CREATE TABLE post 
(
    id INT(11), 
    person_id INT(11) , 
    title VARCHAR(120) , 
    date DATETIME , 
    content TEXT, 
    image BLOB , 
); 

допустим у меня есть более чем 100000 сообщений и я хочу сделать некоторые запрос как

SELECT * FROM post WHERE post.date >= ? AND post.person_id = ? 

бы запрос будет быстрее, если таблица не содержит TEXT и BLOB полей

+0

Вместо ответа на мнение, почему бы не проверить его на себе? – Strawberry

+0

как вставить ** 100,00 ** ряд с изображениями и содержимым текста? – Ali

ответ

4

Да или нет.

Если вы не извлекаете поля text/blob, они не замедляют SELECTs. Если вы это сделаете, то они замедлить ход событий в один или оба из следующих способов:

  • В InnoDB, TEXT и BLOB данных, если достаточно большой, хранятся в отдельном от остальной части колонны. Это может требует дополнительного попадания диска. (Или может не быть, если он уже кэширован.)
  • В сложных запросах (более сложных, чем у вас) Оптимизатору, возможно, потребуется создать временную таблицу. Типичные ситуации: GROUP BY, ORDER BY и подзапросы. Если вы извлекаете текст или blob, таблица temp не может быть MEMORY, но должна быть более медленной MyISAM.
  • Но, реальное замедление, заключается в том, что у вас, вероятно, нет этого составного индекса: INDEX(person_id, date). Без него запрос может выбрать сбор текста/blob (похоронен в *) и вытащить его, только чтобы позже отбросить его.

Действие пунктов:

  • Убедитесь, что у вас есть композитный индекс.
  • Если вам не нужен content для этот запрос, не используйте *.

Если вам нужен TEXT или BLOB, используйте его; альтернативы, как правило, не лучше. Использование «вертикального разбиения» («разделение таблицы», как упоминалось в @changepicture) не лучше в случае InnoDB.(Это был полезный трюк с MyISAM.) InnoDB эффективно «делает раскол для вас».

0

на мой взгляд, т короткий ответ - да. Но, конечно, это еще не все.

Если у вас хорошие индексы, то mysql будет находить данные очень быстро, но поскольку данные большие, тогда потребуется больше времени для отправки данных.

В целом меньшие таблицы и использование числовых типов столбцов обеспечивают лучшую производительность.

И никогда не делайте «SELECT *», это просто плохая практика, и в вашем случае это худшее. Что делать, если вам нужен только заголовок и дата? Вместо передачи нескольких данных вы все переносите.

Рассмотрите разделение таблицы, метаданных в одной таблице и содержимого и изображения в другой таблице. Этот путь проходит через первую таблицу очень быстро, и только тогда, когда вам нужны данные из второй таблицы, вы получите к ней доступ. Вы будете иметь отношение «один к одному», используя эту структуру таблицы.