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

scheme

Про индексы читал, мало что понял. Насколько понял, они нужны, чтобы ускорять запросы. Записей много будет, поэтому задумываюсь о том, чтобы в таблице dpk_add_table_for_all_entries столбцы entry_id и blog_id были индексными. Помогите понять, нужно ли оно и если нужно, то какого плана sql-запрос на создание таблицы.

У меня пока получается что-то вроде этого:

$sql = "CREATE TABLE " . $table_name . " (
  id bigint(20) unsigned NOT NULL auto_increment,
  entry_id bigint(20) NOT NULL,
  blog_id tinyint(3) NOT NULL,
  PRIMARY KEY  (id),
  KEY entry_id (entry_id),
  KEY blog_id (blog_id),
) {$charset_collate};";

dbDelta($sql);

Дополнение №1:

  • в таблицах %wpforms_entries индексный столбец form_id меня не интересует, он в логике моего плагина не участвует (я его рассматриваю просто как столбец)
  • в рамках подсайта записи в таблице ...wpforms_entries уникальны, уникальный индекс entry_id
  • в рамках таблицы dpk_add_table_for_all_entries entry_id неуникален, т.к. в этой таблице могут храниться записи с одинаковым entry_id с разных подсайтов. Иными словами, могут быть 2 и более записи с одинаковыми entry_id, но blog_id у них будет разный. Основываясь на этих данных могу предположить, что стоит сделать составной уникальный индекс, состоящий из entry_id и blog_id

Ответы (1 шт):

Автор решения: KAGG Design

Индексы надо создавать по тем столбцам, по которым будет производиться выборка. Если столбцы присутствуют в WHERE запросах, то индекс весьма уместен.

В вашем случае, похоже, плагин будет делать выборку как минимум по двум столбцам: ...WHERE entry_id = xxx and blog_id=yyy. В этом случае не лишним будет создать составной (composite) индекс.

$sql = "CREATE TABLE " . $table_name . " (
  id bigint(20) unsigned NOT NULL auto_increment PRIMARY KEY,
  entry_id bigint(20) NOT NULL,
  blog_id tinyint(3) NOT NULL,
  INDEX " . $index_name . " (id, entry_id, blog_id) 
) {$charset_collate};";

dbDelta($sql);

В данном случае составной индекс создаётся по столбцам id, entry_id и blog_id. Это ускоряет запросы, в которых присутствуют в WHERE один, два или три указанных столбца.

→ Ссылка