2012-03-02 3 views
15

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

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

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

index1(uid, created_date) 

EXPLAIN EXTENDED результат:

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

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

EDIT: SHOW 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 
+0

+1 за разумный вопрос. однако удаленный тег php. –

+0

@fxuser: Сколько строк имеет таблица? Если их слишком мало, то tb eindex не может быть предъявлен иск. –

+0

@ypercube Показывать строки 0 - 29 (23,521 всего запросов, получено 0,0005 сек) – fxuser

ответ

29

Единственное, что было бы лучше, чем 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 
+0

, так как я использовал SELECT *, это означает, что я хочу, чтобы большинство (если не все) столбцов таблицы ... так что поможет, если i SELECT uid, created_date только? – fxuser

+0

Попробуйте использовать только 'uid' и' created_date'. Ваш 'EXPLAIN' будет показывать« Использование индекса », что означает, что MySQL может возвращать весь набор результатов непосредственно из индекса без необходимости посещать фактические данные таблицы. Это предотвращает два обращения, по одному для каждой возвращаемой строки. Если вы выбираете поле «text», вы не можете использовать индекс покрытия в любом случае, поэтому просто придерживайтесь того, что у вас есть. Читайте о «[охватывающих индексы] (http://www.mysqlperformanceblog.com/2006/11/23/covering-index-and-prefix-indexes/)». –

+0

просто попробовал, но он вернет ошибку php, указав, что одна переменная пыталась получить столбец, не указанный в SELECT ... – fxuser

Смежные вопросы