исправление mysql Использование где;

Мой 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

Как я могу исправить дополнительное поле, где оно использует, где вместо этого можно использовать индексы?

РЕДАКТИРОВАТЬ: ПОКАЗАТЬ СОЗДАТЬ ТАБЛИЦУ:

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

person stergosz    schedule 02.03.2012    source источник
comment
+1 за разумный вопрос. удален тег php, хотя.   -  person Your Common Sense    schedule 02.03.2012
comment
@fxuser: Сколько строк в таблице? Если их слишком мало, то на tb eindex можно не подавать в суд.   -  person ypercubeᵀᴹ    schedule 02.03.2012
comment
@ypercube Отображение строк 0–29 (всего 23 521, запрос занял 0,0005 с)   -  person stergosz    schedule 02.03.2012
comment
Можете ли вы рассказать нам, что показывают SELECT COUNT(*) FROM updates_cats и SELECT COUNT(*) FROM updates_cats WHERE uid =118697835834?   -  person ypercubeᵀᴹ    schedule 02.03.2012
comment
я также добавил SHOW CREATE TABLE - первая строка показывает: 23521 - вторая строка показывает: 2   -  person stergosz    schedule 02.03.2012
comment
Он использует index1 и возвращает 2 строки. В чем проблема?   -  person Marcus Adams    schedule 02.03.2012
comment
Я не уверен, где используется; то, что он возвращает на EXPLAIN, является проблемой или нет ... должен ли я оптимизировать его, чтобы удалить использование, где; на дополнительное поле или все в порядке?   -  person stergosz    schedule 02.03.2012


Ответы (1)


Единственное, что было бы лучше 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
person Marcus Adams    schedule 02.03.2012
comment
поскольку я использовал SELECT *, это означает, что мне нужны большинство (если не все) столбцов таблицы... так что же поможет, если я выберу только uid, created_date? - person stergosz; 02.03.2012
comment
Попробуйте только с uid и created_date. Ваш EXPLAIN покажет Using index, что означает, что MySQL может вернуть весь набор результатов непосредственно из индекса без необходимости посещения фактических данных таблицы. Это предотвращает два поиска, по одному для каждой возвращаемой строки. Если вы выбираете поле text, вы все равно не можете использовать покрывающий индекс, поэтому просто придерживайтесь того, что у вас есть. Прочтите о покрывающих индексах. - person Marcus Adams; 02.03.2012
comment
только что попробовал, но он вернет ошибку php, говорящую, что одна переменная пыталась получить столбец, не указанный в SELECT... - person stergosz; 02.03.2012
comment
Я предлагал запустить его с EXPLAIN, чтобы увидеть разницу, а не менять его в своем приложении. Вы не можете получить значения в PHP из столбцов, которые вы не вернули. - person Marcus Adams; 02.03.2012