2009-11-06 20 views
16

Creo índices sin la cláusula "USAR BTREE". ¿Hay alguna ventaja de usar el índice BTREE?ventaja de BTREE?

CREATE INDEX `SomeName` USING BTREE ON `tbl_Name`(`column_name`); 
+1

La página del manual de MySQL que quiere es [aquí] (http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html). – dnagirl

Respuesta

12

BTREE es el método de índice predeterminado. Puede omitirlo con seguridad.

+9

Eso realmente depende del motor de almacenamiento –

+1

Esto no es cierto para todos los motores de almacenamiento. –

6

Depende del motor de almacenamiento que esté utilizando. Para la mayoría, BTREE es el predeterminado, por lo que especificar que realmente no cambia nada. Para los motores de almacenamiento como MEMORY/HEAP y NDB, el valor predeterminado es usar índices HASH por defecto.

Más información se puede encontrar here.

Sea o no un árbol B o un índice hash es ventajoso para usted desde una perspectiva de rendimiento depende de los datos y cómo se está accediendo a ella. Si sabe que sus consultas van a dirigirse exactamente a una fila o filas individuales dispersas, entonces un índice HASH puede ser útil. Aparte de eso, generalmente prefiero un índice BTREE ya que los datos están ordenados y, por lo tanto, las consultas de rango y las que devuelven múltiples filas son más eficientes.

36

En primer lugar, dependiendo del motor de almacenamiento utilizado, es posible que no tenga opción (InnoDB, por ejemplo, utiliza exclusivamente BTREE para su índice).

Además, BTREE es el tipo de índice predeterminado para la mayoría de los motores de almacenamiento.

Ahora ... Hay casos en que el uso de tipos de índice alternativos puede mejorar el rendimiento. Hay (caso relativamente raro) cuando un índice HASH puede ayudar. Tenga en cuenta que cuando se crea un índice HASH, también se produce un índice BTREE. Eso se debe en parte al hecho de que los índices hash solo pueden resolver predicados de igualdad. (una condición como WHERE Price> 12.0 no podría ser manejada por un índice de hash).

En resumen: siga utilizando BTREE, ya sea implícitamente (si BTREE es el valor predeterminado para el almacenamiento utilizado), o explícitamente. Obtenga información sobre los otros tipos de índices para que los conozca si fuera necesario.

Editar: (en la búsqueda de los casos cuando se pueden utilizar tipos de índices alternos)
Efectivamente el caso es bastante sencillo para RTREE índices. Estos solo son compatibles, con MySQL, en el contexto de "SPATIAL" databases, es decir, bases de datos que incluyen contexto de posición geográfica como punto y otro objeto en el modelo GIS).

Los índices HASH son más genéricos (no se limitan a una aplicación o tipo de datos en particular), y generalmente se puede seguir la comprensión intuitiva de hashes para obtener una pista sobre cuándo estos pueden superar al antiguo pero fiel BTREE. Como se indicó anteriormente, esto implicaría columnas típicamente buscadas con un predicado igual. Supongo que las tablas de búsqueda relativamente cortas y similares podrían beneficiarse, dependiendo de la implementación efectiva dentro de MySQL.

+1

¿Cómo forzamos a MySQL a crear solo un índice hash y no un índice btree si no necesitamos ordenar? (por ejemplo, una clave principal que no necesita ser ordenada) – Pacerier

2

buscando un árbol equilibrado significa que todas las hojas tienen la misma profundidad. No hay puntero en la pista por encima. De hecho, incluso árboles B más grandes pueden garantizar que se recupere una pequeña cantidad de nodos para encontrar una clave determinada. Por ejemplo, un árbol B de 10,000,000 de claves con 50 claves por nodo nunca necesita recuperar más de 4 nodos para encontrar ninguna clave. Un B-tree es un formato de estructura de datos especial para un índice que permite el acceso rápido de los datos en el índice. Una de las propiedades de esta estructura de datos es que el índice siempre es equilibrado. Esto significa que cada nodo en el nivel más bajo es equidistante. desde el nodo más superior, o el nodo raíz del árbol. Y cada lado del índice tiene el mismo número de nodos. Los nodos en los niveles más bajos se conocen como nodos hoja. Todos los demás nodos se conocen como nodos de rama. a otras ramas o nodos de hojas.Los nodos Leaf almacenan los valores de las columnas indexadas y el rowid que apunta a la fila distinta que tiene esos valores. La distribución real dependerá del número de valores de datos en cada rango de valores en un árbol B con el objetivo general de reducir el número de niveles requeridos que se deben atravesar para llegar a un valor específico. La ventaja de una estructura de árbol B es:

  1. Todos los bloques de hojas tienen la misma profundidad (número de valores).
  2. La altura del árbol B es normalmente bastante small.In algunos casos, el nodo raíz es el único nodo hoja y la altura es 1.As las tablas quedan más filas insertadas en él, el índice debe crecer para adaptarse a esta .Pero incluso en tablas con más de 1 millón de filas, el idex del árbol B suele tener una altura 3.En las tablas más grandes, la altura puede ser solo 4. Esto significa que incluso para las tablas más grandes, solo se necesitan 4 bloques para encontrar el hilera de la fila que está buscando, esto es extremadamente eficiente.
  3. En los casos de datos ingresados ​​aleatoriamente, el árbol B se mantiene automáticamente saldos. De hecho, el árbol B se mantiene equilibrado independientemente de los datos ingresados.
  4. Todos los bloques de un índice B-tree son tres cuartas partes llenos (en promedio), lo que permite la inserción sin rebullido. 5.B-tree proporciona un excelente rendimiento para todos los tipos de selects. 6.Insertar, actualizar y eliminar tienden a ser eficientes en una estructura de árbol B. 7. El rendimiento del árbol B permanece óptimo incluso cuando las tablas son pequeñas o grandes.
0

La respuesta simplificada es que si su SQL usa una declaración LIKE en ese campo, entonces el uso del índice BTREE debería superar el índice Hash. Si usa declaraciones iguales a (=) en ese campo, quédese con el índice Hash.