Проблема с индексом Mysql при использовании оператора «ИЛИ» - PullRequest
1 голос
/ 07 ноября 2010

Есть ли способ, как создать функционирующий индекс для этого запроса и избавиться от "файловой сортировки"?

SELECT id, title FROM recipes use index (topcat) where
(topcat='$cid' or topcat2='$cid' or topcat3='$cid') 
and approved='1' ORDER BY id DESC limit 0,10; 

Я создал индекс "topcat" (столбцы: topcat1 + topcat2 + topcat3 + Approved + id), но все еще ge "Using where; Using filesort".

Я могу создать еще один столбец, скажем, «all_topcats» для хранения чисел topcat в массиве - 1,5,7, а затем выполнить запрос «... где $ cid iIN () ...». Но проблема в том, что в этом случае столбец «all_topcats» будет «varchar», а столбцы «утверждено» и «id» - int, и индекс все равно не будет использоваться.

Есть идеи? Спасибо.

1 Ответ

1 голос
/ 07 ноября 2010

Вы можете повысить производительность для этого запроса, если переупорядочите столбцы в индексе:

approved, topcat1, topcat2, topcat3, id

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

Можете ли вы опубликовать CREATE TABLE?

Редактировать в ответ на сообщение пользователя

Ваш стол не выглядит хорошо продуманным.Следующий дизайн был бы лучше: добавьте две новые таблицы, Category и Category_Recipe (таблица перекрестных ссылок).Category будет содержать список ваших категорий, а Category_Recipe будет содержать два столбца, один внешний ключ для Category и один внешний ключ для существующей таблицы Recipe.В строке Category_Recipe указано «этот рецепт в этой категории».После этого вы сможете очень просто написать запрос, который будет искать рецепты в данной категории.У вас также есть возможность поместить рецепт в произвольное количество категорий, а не ограничиваться 3. Найдите «нормализация базы данных» и «внешние ключи».

...