[mysql] Cuándo agregar los índices en una tabla en Rails



Answers

La indexación puede ser algo complicado y sutil, pero existen reglas generales aplicables que pueden facilitar la determinación de qué utilizar.

Lo primero que debe recordar es que los índices pueden funcionar en más de una forma. Un índice en A, B, C también funciona para A, B y simplemente A, por lo que puede diseñar sus índices para que sean más versátiles si los ordena correctamente. La guía telefónica está indexada en Apellido, Nombre, para que pueda buscar personas fácilmente por su apellido o una combinación de apellido y nombre. Sin embargo, no puede buscarlos directamente por su primer nombre. Necesitarías un índice separado para eso. Lo mismo vale para el número de teléfono, que también debería indexar.

Con eso en mente, hay muchas cosas que dictarán cómo crear índices:

  • Si tiene una pareja de relaciones belongs_to - has_many , debe tener un índice en la clave externa utilizada.
  • Si solicita sus registros, y hay un gran número de ellos que serán paginados, debe agregar esa columna de pedido al final del índice.
  • Si tiene una relación has_many :through , su tabla de unión debe tener un índice único en ambas propiedades involucradas en la combinación como una clave compuesta.
  • Si obtiene un registro directamente utilizando un identificador único como nombre de usuario o correo electrónico, ese debería ser un índice único.
  • Si obtiene conjuntos de registros de una relación has_many utilizando un ámbito, asegúrese de que haya un índice que incluya la clave externa has_many y la columna del alcance en ese orden.

El objetivo con los índices es eliminar las temidas operaciones de "escaneo de tabla" u "clasificación de archivos" que ocurren cuando sus datos no están indexados correctamente.

En términos simples, observe las consultas generadas por su aplicación y asegúrese de que las columnas a las que se hace referencia en WHERE o HAVING condiciones y las cláusulas ORDER BY estén representadas en ese orden.

Question

Tengo una pregunta sobre la base de datos de Rails.

  • ¿Debo agregar "índice" a todas las claves foráneas como "xxx_id"?
  • ¿Debería agregar "índice" a la columna "id" creada automáticamente?
  • ¿Debería agregar "índice (único)" a la columna "id" creada automáticamente?

  • Si agrego el índice a dos claves foráneas a la vez ( add_index (:users, [:category, :state_id]) , ¿qué ocurre? ¿En qué se diferencia esto de agregar el índice para cada clave?

    class CreateUsers < ActiveRecord::Migration
      def self.up
        create_table :users do |t|
          t.string :name
          t.integer :category_id 
          t.integer :state_id
          t.string :email
          t.boolean :activated
          t.timestamps
        end
      # Do I need this? Is it meaningless to add the index to the primary key?
      # If so, do I need :unique => true ?
      add_index :users, :id 
      # I don't think I need ":unique => true here", right?
      add_index :users, :category_id # Should I need this?
      add_index :users, :state_id # Should I need this?
      # Are the above the same as the following?
      add_index (:users, [:category, :state_id])
      end
    end
    

Gran respuesta hasta el momento. Pregunta adicional

  • Debo agregar "índice con único" para xxx_id, ¿verdad?



Related