2009-08-22 23 views
17

Recientemente comencé a desarrollar mi primera aplicación seria que usa una base de datos SQL, y estoy usando phpMyAdmin para configurar las tablas. Hay un par de características opcionales "" Puedo dar varias columnas, y no estoy del todo seguro de lo que hacen:SQL: ¿qué hacen exactamente las claves primarias y los índices?

  • clave principal Índice

  • Yo sé lo que es un PK es para y cómo usarlo, pero supongo que mi pregunta con respecto a eso es por qué uno necesita uno, ¿cómo es diferente de simplemente establecer una columna como "Único", aparte del hecho de que solo puede tener un PK? ¿Es solo para que el programador sepa que este valor identifica de manera única el registro? ¿O tiene algunas propiedades especiales también?

    No tengo idea de qué es "Index", de hecho, las únicas veces que lo he visto en uso son (1) que mis claves principales parecen estar indexadas, y (2) escuché que la indexación es de alguna manera relacionado con el rendimiento; que quiere columnas indexadas, pero no demasiadas. ¿Cómo se decide qué columnas indexar y qué hace exactamente?

    editar: si uno indexa columnas, es probable que desee ORDER BY?

    Muchas gracias,

    Mala

  • Respuesta

    25

    clave primaria se utilizan generalmente para crear un 'id' numérica para sus archivos, y esta columna ID se incrementa automáticamente.

    Por ejemplo, si usted tiene una mesa books con un campo id, donde el id es la clave principal y también está listo para auto_increment (Bajo 'supletoria en phpmyadmin), entonces la primera vez que añadir un libro a la mesa, la identificación para eso se convertirá en 1 '. La identificación del próximo libro sería automáticamente '2', y así sucesivamente. Normalmente, cada tabla debe tener al menos una clave primaria para ayudar a identificar y encontrar registros fácilmente.

    Los índices se utilizan cuando necesita recuperar cierta información de una tabla con regularidad. Por ejemplo, si tiene una tabla users, y necesitará acceder a la columna email mucho, puede agregar un índice en el correo electrónico, y esto provocará que las consultas que acceden al correo electrónico sean más rápidas.

    Sin embargo, también hay inconvenientes para agregar índices innecesarios, por lo que solo agregue esto en las columnas a las que realmente se necesita acceder más que las demás. Por ejemplo, las consultas UPDATE, DELETE y INSERT serán un poco más lentas cuantos más índices tenga, ya que MySQL necesita almacenar información adicional para cada columna indexada. Más información se puede encontrar en this page.

    Editar: Sí, las columnas que deben utilizarse en ORDER BY mucho deben tener índices, así como los utilizados en WHERE.

    +2

    ¡gracias, has sido muy útil! Sin embargo, me preguntaba si configurar una columna como PK diferente de establecer una columna como entero único que autoincrementa. ¿Hace algo más bajo el capó? – Mala

    +1

    He corregido para responder a su pregunta sobre las desventajas de los índices. Las claves primarias también funcionan como índices, por lo que cuando tienes un PK en una columna, todas las consultas para SELECT u ORDER BY basadas en esa identificación serán más rápidas. Además, se garantizará que cada 'id' sea único, por lo tanto, no tendrá identificaciones duplicadas como las que podría tener si solo tiene una columna INT que está actualizando. –

    +3

    Una clave principal no necesita ser numérica, o un solo campo. y la columna de IDENTIDAD se ajustaría mejor a esa descripción. En cambio, una clave principal sirve para decirle al RDBMS que los campos especificados pueden identificar de manera única una sola fila en la tabla. Esencialmente un ÍNDICE ÚNICO. Es normal (pero no obligatorio) que las claves primarias sean también el factor de control en qué orden se almacenan los datos (Clave principal en clúster en SQLServer) y mejoran significativamente la toma de tiempo para encontrar filas de datos (para leer, escribir, lo que sea) – MatBailie

    7

    La clave principal es básicamente una columna única e indexada que actúa como el ID "oficial" de las filas en esa tabla. Lo que es más importante, generalmente se usa para relaciones de claves foráneas, es decir, si otra tabla hace referencia a una fila en la primera, contendrá una copia de la clave primaria de esa fila.

    Tenga en cuenta que es posible tener una clave primaria compuesta, es decir, una que consta de más de una columna.

    Los índices mejoran los tiempos de búsqueda. Por lo general, se basan en árboles, por lo que buscar una determinada fila a través de un índice toma el tiempo O (log (n)) en lugar de explorar la tabla completa.

    Generalmente, cualquier columna en una tabla grande que se usa con frecuencia en WHERE, ORDER BY o (especialmente) JOIN cláusulas debería tener un índice. Dado que el índice necesita actualizarse para cada INSERT, UPDATE o DELETE, ralentiza esas operaciones. Si tiene pocas escrituras y muchas lecturas, indexe el contenido de su audiencia. Si tiene muchas escrituras y muchas consultas que requieren índices en muchas columnas, entonces tiene un gran problema.

    6

    La diferencia entre una clave principal y una clave única se explica mejor a través de un ejemplo.

    Tenemos una tabla de usuarios:

    USER_ID number 
    NAME varchar(30) 
    EMAIL varchar(50) 
    

    En esa mesa del USER_ID es la clave principal. El NOMBRE no es único: hay muchos John Smiths y Muhammed Khans en el mundo. El EMAIL es necesariamente único, de lo contrario, el sistema de correo electrónico mundial no funcionaría. Así que ponemos una restricción única en EMAIL.

    ¿Por qué entonces necesitamos una clave principal separada? Por tres razones:

    1. la tecla numérica es más eficiente cuando se utiliza en clave relaciones exteriores, ya que ocupa menos espacio
    2. el correo electrónico puede cambiar (por ejemplo proveedor de intercambio), pero el usuario es siendo el mismo ; ondulante un cambio de un valor de clave principal a lo largo de un esquema es siempre una pesadilla
    3. es siempre una mala idea usar información confidencial o privada como una clave externa
    3

    En el modelo relacional, cualquier la columna o conjunto de columnas que se garantiza que están presentes y únicas en la tabla se puede llamar una clave candidata para la tabla. "Presente" significa "NO NULO". Es una práctica común en el diseño de la base de datos designar una de las claves candidatas como la clave principal, y usar referencias a la clave primaria para referirse a toda la fila, o al elemento temático que describe la fila.

    En SQL, una restricción PRIMARY KEY equivale a una restricción NOT NULL para cada columna de clave principal, y una restricción UNIQUE para todas las columnas de clave primaria tomadas juntas. En la práctica, muchas claves principales resultan ser columnas individuales.

    Para la mayoría de los productos DBMS, una restricción PRIMARY KEY también dará como resultado que se genere un índice automáticamente en las columnas de clave principal. Esto acelera la actividad de comprobación de sistemas cuando se realizan nuevas entradas para la clave principal, para asegurarse de que el nuevo valor no duplica un valor existente. También acelera las búsquedas basadas en el valor de la clave primaria y se une entre la clave principal y una clave externa que hace referencia a ella. Cuánta aceleración se produce depende de cómo funciona el optimizador de consultas.

    Originalmente, los diseñadores de bases de datos relacionales buscaron claves naturales en los datos tal como se proporcionan. En los últimos años, la tendencia ha sido siempre crear una columna llamada ID, un entero como la primera columna y la clave principal de cada tabla. La característica de autogeneración del DBMS se utiliza para garantizar que esta clave sea única. Esta tendencia está documentada en los "estándares de diseño de Oslo".No es necesariamente un diseño relacional, pero sirve para algunas necesidades inmediatas de las personas que lo siguen. No recomiendo esta práctica, pero reconozco que es la práctica predominante.

    Un índice es una estructura de datos que permite un acceso rápido a unas pocas filas en una tabla, basándose en una descripción de las columnas de la tabla que están indexadas. El índice consiste en copias de ciertas columnas de tabla, denominadas claves de índice, intercaladas con punteros a las filas de la tabla. Los punteros generalmente están ocultos a los usuarios de DBMS. Los índices funcionan en conjunto con el optimizador de consultas. El usuario especifica en SQL qué datos se buscan y el optimizador presenta estrategias de índice y otras estrategias para traducir lo que se busca en una estrategia para encontrarlo. Existe algún tipo de principio de organización, como clasificación o hash, que permite que un índice se use para búsquedas rápidas y ciertos otros usos. Todo esto es interno al DBMS, una vez que el generador de la base de datos ha creado el índice o declarado la clave primaria.

    Se pueden generar índices que no tienen nada que ver con la clave principal. Una clave principal puede existir sin un índice, aunque esto generalmente es una muy mala idea.

    +0

    (si todavía está cerca) = Tengo curiosidad por qué no recomienda configurar una columna entera como clave principal. He hecho de esto una práctica habitual en mi desarrollo de SQL y he descubierto que hace selecciones, actualizaciones, inserciones y eliminaciones de scripts PHP (así como establecer relaciones entre tablas y crear combinaciones) mucho más simple que confiar en PK naturales derivadas de los datos. – Vega

    +0

    Es un punto discutible, ya que mi vista es una visión minoritaria. –

    Cuestiones relacionadas