mysql fix Использование где; - PullRequest
15 голосов
/ 02 марта 2012

Мой SQL-запрос:

SELECT *
FROM updates_cats
WHERE uid =118697835834
ORDER BY created_date ASC

Текущие индексы:

index1(uid, created_date)

ОБЪЯСНИТЕ РАСШИРЕННЫЙ результат:

1 SIMPLE updates_cats ref index1 index1 8 const 2 100.00 Using where

Как исправить поле Extra, где оноимеет Using где, чтобы вместо этого он мог использовать индексы?

РЕДАКТИРОВАТЬ: ПОКАЗАТЬ CREATE TABLE:

CREATE TABLE `updates_cats` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `u_cat_id` bigint(20) NOT NULL DEFAULT '0',
 `uid` bigint(20) NOT NULL,
 `u_cat_name` text COLLATE utf8_unicode_ci NOT NULL,
 `total_updates` int(11) unsigned NOT NULL DEFAULT '0',
 `created_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 PRIMARY KEY (`id`),
 KEY `index1` (`uid`,`created_date`)
) ENGINE=MyISAM AUTO_INCREMENT=23522 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

1 Ответ

36 голосов
/ 02 марта 2012

Единственное, что будет лучше, чем Using where, это Using where; Using index с "индексом покрытия". Попробуйте выбрать uid и created_date.

Using where в порядке. Это означает, что он применяет указанный индекс к предложению WHERE и сокращает количество возвращаемых строк. Чтобы избавиться от него, вам нужно избавиться от предложения WHERE.

Вот что вас должно беспокоить:

  • Using filesort
  • Using temporary
  • Не используется индекс: NULL в столбце «ключ» EXPLAIN и большое количество строк в столбце «ряды».

Ваш результат EXPLAIN показывает, что MySQL применяет index1 к предложению WHERE и возвращает 2 строки:

1 SIMPLE updates_cats ref index1 index1 8 const 2 100.00 Using where
...