powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как расставить индексы в MySQL с различными сортировками?
10 сообщений из 10, страница 1 из 1
Как расставить индексы в MySQL с различными сортировками?
    #38951180
inpost
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE IF NOT EXISTS `mess_sett` (
`id` int(10) unsigned NOT NULL,
  `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `prew` text COLLATE utf8mb4_unicode_ci NOT NULL,
  `man_id` int(10) unsigned NOT NULL,
  `girl_id` int(10) unsigned NOT NULL,
  `man_where` enum('inbox','outbox','') COLLATE utf8mb4_unicode_ci NOT NULL,
  `man_group` tinyint(1) NOT NULL DEFAULT '0',
  `man_saw` tinyint(1) NOT NULL DEFAULT '0',
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;



Всего записей 20 млн.
Выборка по `man_id` вернёт около 3000-4000 тысяч записей
Выборка по `man_id` + `man_where` оставит уже 2000-3000 тысячи записей
Выборка по `man_id` + `man_where` + `man_group` оставит уже в одном разделе 1990-2990, в другом 10 записей. (то есть по полю `man_group` отсеиваются всего 10 записей).

Запросы:
Код: sql
1.
2.
3.
SELECT ... WHERE `man_id` = 1 AND `man_where` = 'inbox' AND `man_group` = 1 ORDER BY `id` DESC
SELECT ... WHERE `man_id` = 1 AND `man_where` = 'inbox' AND `man_group` = 1 ORDER BY `man_saw` ASC
SELECT ... WHERE `man_id` = 1 AND `man_where` = 'inbox' AND `man_group` = 1 ORDER BY `girl_id` ASC



Без составного индекса по полю сортировки во временной таблице будет сортироваться около 1000-2000 записей.
Как верно в данном случае составить индекс/индексы?

Я вот думаю:
1) Только лишь составной по
`man_id` + `man_where` + `man_group`
2) Сделать 3 составных индекса по полям:
`man_id` + `man_where` + `man_group` + `id`
`man_id` + `man_where` + `man_group` + `girl_id`
`man_id` + `man_where` + `man_group` + `man_saw`

3) Сделать 1 составной и несколько простых с надеждой, что мускул сам объединит индексы и правильно всё сделает:
`man_id` + `man_where` + `man_group`
`id`
`girl_id`
`man_saw`
...
Рейтинг: 0 / 0
Как расставить индексы в MySQL с различными сортировками?
    #38951193
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
inpost3000-4000 тысячЭто сколько? 3-4 миллиона?

И куда потерялся первичный ключ в таблице?

Я бы попробовал первый и второй второй варианты. Возможно, первый вариант индекса поможет и с сортировкой (если я правильно понял, что первичный ключ - это поле id).
...
Рейтинг: 0 / 0
Как расставить индексы в MySQL с различными сортировками?
    #38951195
inpost
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извиняюсь за косяк, там имелось ввиду 3000-4000, без тысяч.
...
Рейтинг: 0 / 0
Как расставить индексы в MySQL с различными сортировками?
    #38951196
inpost
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
"(если я правильно понял, что первичный ключ - это поле id)."
Да, все верно.
...
Рейтинг: 0 / 0
Как расставить индексы в MySQL с различными сортировками?
    #38951198
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
inpostИзвиняюсь за косяк, там имелось ввиду 3000-4000, без тысяч.Тогда, возможно, индекс по `man_id` окажется достаточно эффективным, чтобы не создавать остальные индексы. Зависит от требований к быстродействию и доли запросов модификации данных.
...
Рейтинг: 0 / 0
Как расставить индексы в MySQL с различными сортировками?
    #38951423
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
inpost,

у тебя во всех запросах не более 5 тыщ записей под сортировку, это немного, и индексами это оптимизировать не стоит.

оптимизируй выборки.

потом еще посмотрю на твои запросы....
...
Рейтинг: 0 / 0
Как расставить индексы в MySQL с различными сортировками?
    #38951476
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Селективность индекса по man_id достаточно высока, чтобы он один обеспечивал оптимальность выполнения. Селективность по остальным полям отбора с учётом отбора по man_id составляет плюс-минус половину, и нет смысла включать в индекс ещё и их. Равно как и поля сортировки. Точно так же не имеет смысла создавать покрывающие индексы - минимальный профит от их использования заведомо сожрётся накладными расхордами на модификацию данных.
Сортировка же нескольких тысяч записей, да чисто по одному полю - это операция, оптимизировать которую не имеет смысла, она достаточно быстрая даже по сравнению с получением выводных полей с диска для выдачи. Тем более что она явно предусматривает интерактивную выдачу результата запроса.
...
Рейтинг: 0 / 0
Как расставить индексы в MySQL с различными сортировками?
    #38951510
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чего-то я не понял.
3-4 тысячи записей в таблице -- тогда вообще никакие индексы не нужны, пока таблица не вырастит.
...
Рейтинг: 0 / 0
Как расставить индексы в MySQL с различными сортировками?
    #38951516
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivчего-то я не понял.
3-4 тысячи записей в таблице -- тогда вообще никакие индексы не нужны, пока таблица не вырастит.inpostВсего записей 20 млн.
...
Рейтинг: 0 / 0
Как расставить индексы в MySQL с различными сортировками?
    #38951519
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivчего-то я не понял.
3-4 тысячи записей в таблице -- тогда вообще никакие индексы не нужны, пока таблица не вырастит.

сорри, не так понял.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как расставить индексы в MySQL с различными сортировками?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]