2012-03-02 16 views
15

Mi consulta SQL:mysql fix Usando where;

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

índices actuales:

index1(uid, created_date) 

EXPLIQUE resultado extendió:

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

¿Cómo puedo solucionar el campo adicional donde se ha Utilizando donde lo que se puede utilizar los índices en su lugar?

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 para la pregunta sensata. eliminado la etiqueta php sin embargo. –

+0

@fxuser: ¿Cuántas filas tiene la tabla? Si son muy pocos, entonces tb eindex no puede ser demandado. –

+0

@ypercube Mostrando las filas 0 - 29 (23,521 total, la consulta tomó 0.0005 seg) – fxuser

Respuesta

29

La única cosa que sería mejor que Using where es Using where; Using index con un "índice de cobertura". Intente seleccionar solo uid y created_date.

Using where está bien. Significa que aplica el índice indicado a la cláusula WHERE y reduce las filas devueltas. Para deshacerse de él, tendría que deshacerse de la cláusula WHERE.

Estas son las cosas que usted debe estar preocupado por:

  • Using filesort
  • Using temporary
  • No usar un índice: NULL en la columna 'clave' de la EXPLAIN y un gran número de filas en la columna 'filas'.

Su resultado EXPLAIN muestra que MySQL es la aplicación de la cláusula index1 a WHERE y devolver filas 2:

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

, ya que utilicé SELECT * significa que quiero la mayoría (si no todas) las columnas de la tabla ... ¿qué ayudaría si SELECCIONO uid, created_date only? – fxuser

+0

Pruébalo con solo 'uid' y' created_date'. Su 'EXPLAIN' mostrará' Using index', lo que significa que MySQL puede devolver todo el conjunto de resultados directamente desde el índice sin tener que visitar los datos reales de la tabla. Esto evita dos búsquedas, una por cada fila devuelta. Si selecciona el campo 'text', no puede usar un índice de cobertura de todos modos, así que simplemente quédese con lo que tiene. Lea sobre "[índices de cobertura] (http://www.mysqlperformanceblog.com/2006/11/23/covering-index-and-prefix-indexes/)". –

+0

lo intenté pero devolverá un error de php diciendo que una variable intentó obtener una columna no especificada en SELECT ... – fxuser