Влияние количества полей таблицы на производительность.
У меня вопрос. Как влияет количество полей таблицы Mysql при таких условиях:
- Количество полей может достигать 50
- Записей в таблице может быть 10 млн.
- Поля преимущественно int 10 и Longtext
- Выборка из таблицы по id, это же поле первичный ключ
- Выбираются всегда НЕ все поля
И вытекающий из предыдущего вопроса такой: на сколько влияет на скорость выборка из двух таблиц, если 50 полей таблицы разделить на 2 таблицы по 25 или на 3 по 17. Быстрее ли будет работать выборка из каждой таблицы отдельно?
1 ответов
>Быстрее ли будет работать выборка из каждой таблицы отдельно?
Если запрос будет выбирать колонки только из одной таблицы, то быстрее, но лишь на 0.1% или около того. Да и то при условии, что база поднимает данные с жесткого диска, а не из памяти и не флеш-диска. Основная часть времени, как мне кажется, уйдет на чтение полей. Если они расположены близко, это сократит время поиска (average seek time). Теоретически.
Если вам понадобятся поля из разных таблиц, то таблицы придется соединять через join. Это замедлит выборку процентов на 50%. Кроме того, вам нужен будет для каждой таблицы отдельный индекс (хотя бы тот, что на первичном ключе), чтобы эффективно выбирать и соединять строки. Тогда места под индексы нужно в 2-3 раза больше. Так как индексы обычно кешируются в памяти, это съест еще и памяти во столько же раз больше. Даже если вы не выбираете поля из двух таблиц сразу, эта память все-равно уже съедена.
Плюс проблемы с поддержкой контроля целостности. И общее усложнение архитектуры и соответственно сложность поддержки. Необходимость выбора таблицы, в зависимости от полей и прочего. Необходимость вместо одного insert производить два или три в одной транзакции. И т.п.
Спасибо всем за ответы.
Думаю, оставлю поля в одной таблице, занесу 10000000 записей тестовых (почти одинаковых) и проведу замер времени. Потом сделаю тоже самое на 2 или 3 таблицах...
То, что запрос через JOIN будет медленнее - это факт. Но как себя MySQL поведет с таблицей, вес которой будет около 0.5Gb, посмотрим :)