Как определить оптимальные индексы таблиц MySQL, когда содержание предложения WHERE различается - PullRequest
0 голосов
/ 23 сентября 2011

У меня есть следующие 2 mysql_queries:

Запрос 1 (этот запрос повторяется еще два раза для imgClass и imgGender):

$imgFamily_query = "SELECT DISTINCT imgFamily FROM primary_images WHERE '$clause' ";

Запрос 2:

$query_pag_data = "SELECT imgId, imgURL, imgTitle, view, secondary FROM primary_images WHERE '$clause' ORDER BY imgDate DESC";

Как видите, WHERE управляется переменной.Эта переменная рассчитывается следующим образом:

$where_clauses = array();

if ($imgFamilyFalse && $imgClassFalse && $imgGenderFalse) {
    $where_clauses[] = "1=1"; // default do-nothing clause
}

if ($imgFamilyTrue) {
   $where_clauses[] = 'imgFamily=' . "'" . mysql_real_escape_string($_GET['imgFamily']) . "'";
}
if ($imgClassTrue) {
   $where_clauses[] = 'imgClass=' . "'" . mysql_real_escape_string($_GET['imgClass']) . "'";
}
if ($imgGenderTrue) {
   $where_clauses[] = 'imgGender=' . "'" . mysql_real_escape_string($_GET['imgGender']) . "'";
}


$clause = implode(' AND ', $where_clauses);

Предложение WHERE зависит только от следующих 3 столбцов:

  1. imgFamily
  2. imgClass
  3. imgGender

Однако, в зависимости от ситуации, комбинация любых 1, 2 или 3 из нихиспользуются столбцы.

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

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

Можно ли настроить несколько индексов с несколькими столбцами?Или было бы лучше в этом случае просто разместить индекс для каждого из 3 рассматриваемых столбцов?

Ответы [ 2 ]

3 голосов
/ 23 сентября 2011

Я предполагаю, что imgGender будет содержать только 2 или 3 значения - M, F и возможно неизвестно? В этом случае это делает плохим кандидатом на индекс.

Итак, я думаю, что вы можете обойтись двумя индексами. Индекс один должен использовать только imgClass и будет срабатывать, когда столбец imgFamily не является частью предложения where. Второй индекс должен быть составным, используя imgFamily и imgClass; это следует использовать, даже если imgClass не является частью предложения where.

1 голос
/ 23 сентября 2011

В соответствии с вашей ситуацией лучше хранить 3 отдельных индекса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...