MySQL: индексы почти на каждый столбец - это плохо?

12
Р
На сайте с 17.05.2011
Offline
136
3066

Если вкратце, то задача у меня примерно такая: есть таблица с 18 столбцами. Больше половины из них (14) имеют индексы (один столбец - уникальный, остальные - просто индексы, без объединений и пр.).

Индексы я пока создал для всех столбцов по которым будет идти выборка и ранжирование.

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

Есть другая таблица, где операции изменения будут происходить как минимум с такой же частотой как и выборки (а скорее даже в 1,5-2 раза чаще). Но там столбцов поменьше и индексов только 3 + 1 уникальный (уникальный для поиска использоваться не будет).

Я так понимаю, что индексы это хорошо для SELECTов и плохо для DELETE, UPDATE и INSERT-ов.

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

Какие вообще есть соображения у сообщества?

Спасибо!

S
На сайте с 17.08.2008
Offline
114
#1

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

Желательно делать индексы по столбцам по которым идет выборка... Если выборка происходит по произвольному столбцу без участия других, возможно следует оставить как есть. EXPLAIN в помощь.

danforth
На сайте с 18.12.2015
Offline
153
#2
smbbws:
Желательно делать индексы по столбцам по которым идет выборка...

Желательно делать индексы по столбцам, по которым идет WHERE и ORDER BY (операции фильтрации и сортировки).

Если в запросе два WHERE то нужно делать составные индексы.

На все столбцы делать индексы не нужно.

Junior Web Developer
LEOnidUKG
На сайте с 25.11.2006
Offline
1723
#3

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

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

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
Aisamiery
На сайте с 12.04.2015
Offline
293
#4

Индексы на все столбцы вообще ересь какая то. В запросе БД может использовать только 1 индекс, всегда только один, и выбирает максимально оптимальный. А составные должны быть точто в таком же порядке как и в выражения where. По факту получается, что у вас беда с архитектурой БД, потому что в теории (ведь это реляционная БД) вам не должно понадобиться такое количество индексов в рамкох одной таблицы. Хотя фиг его знает что у вас там за приложение.

А вот перестраивать индексы в большой таблице при insert/update/delete может стать огромной проблемой

Разработка проектов на Symfony, Laravel, 1C-Bitrix, UMI.CMS, OctoberCMS
TF-Studio
На сайте с 17.08.2010
Offline
334
#5

возможно оптимальнее было бы разбить БД

а вообще тестируйте. смотрите как быстрее и найдете свое

+ в гугле куча опыта есть уже, читайте

Всё ещё лучший способ заработка для белых сайтов: GoGetLinks (https://www.gogetlinks.net/?inv=fahbn8).
Р
На сайте с 17.05.2011
Offline
136
#6
Aisamiery:
...Хотя фиг его знает что у вас там за приложение.

Приложение: представьте себе таблицу с параметрами товаров (как я выше писал их сейчас 14), юзер видит эту таблицу у себя в браузере. Юзеру дается возможность фильтровать и/или сортировать по любому столбцу. Я так считаю, что в данном случае на каждый такой столбец нужно по индексу.

Aisamiery
На сайте с 12.04.2015
Offline
293
#7
Рамарио:
Приложение: представьте себе таблицу с параметрами товаров (как я выше писал их сейчас 14), юзер видит эту таблицу у себя в браузере. Юзеру дается возможность фильтровать и/или сортировать по любому столбцу. Я так считаю, что в данном случае на каждый такой столбец нужно по индексу.

Мммм, индексы хорошо работают только тогда, когда таблица не может влезть в буфер (оперативку) целиком. У вас так много товаров? Если товаров действительно много + куча вариаций + куча поставщиков, ну например как яндекс маркет, то вам надо просто построить свой индекс, где будет 3 столбика, первый название параметра(id или что то подобное), второе поле это его значение, а третий список ID товаров, у которых этот параметр равен этому значению.

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

bay_ebook
На сайте с 28.05.2010
Offline
111
#8
Рамарио:
Приложение: представьте себе таблицу с параметрами товаров (как я выше писал их сейчас 14), юзер видит эту таблицу у себя в браузере. Юзеру дается возможность фильтровать и/или сортировать по любому столбцу. Я так считаю, что в данном случае на каждый такой столбец нужно по индексу.

Параметры вынесите в отдельную таблицу, дальше читаем про связи много-ко-многим и убираем эти ненужные 18 полей/индексов. JOIN тут в любом случаи будет веселее.

Нужен прогер на php+mysql+понимание чужего кода? (/ru/forum/540660) Вам сюда PHP-шаман (http://php-shaman.pw/)
B
На сайте с 13.02.2008
Offline
262
#9
bay_ebook:
Параметры вынесите в отдельную таблицу, дальше читаем про связи много-ко-многим и убираем эти ненужные 18 полей/индексов. JOIN тут в любом случаи будет веселее.

И мы получим в 18 раз большую таблицу. Правда с одним индексом, что хорошо, но при добавлении-изменении-удалении товара надо будет править 19 строк вместо одной, что плохо. И это решение будет нормальным, если джоинов мало (например фильтр по одному-двум-трем параметрам). А если фильтр по 10 параметрам? База загнется от такого запроса.

dkameleon
На сайте с 09.12.2005
Offline
386
#10
bay_ebook:
Параметры вынесите в отдельную таблицу, дальше читаем про связи много-ко-многим и убираем эти ненужные 18 полей/индексов. JOIN тут в любом случаи будет веселее.

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

Дизайн интерьера (http://balabukha.com/)
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий