Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

[SOLUCIONADO] consulta por nombre

Estas en el tema de consulta por nombre en el foro de Mysql en Foros del Web. Muchachos les tengo una pregunta, si yo hago una consulta dando en la condicion WHERE un campo que no es clave ( ni primaria ni ...
  #1 (permalink)  
Antiguo 13/02/2013, 18:42
 
Fecha de Ingreso: febrero-2011
Mensajes: 108
Antigüedad: 13 años, 2 meses
Puntos: 4
consulta por nombre

Muchachos les tengo una pregunta, si yo hago una consulta dando en la condicion WHERE un campo que no es clave ( ni primaria ni foranea) como por ejemplo de una tabla de personas quisiera obtener todos los datos pero la condicion para buscar sea su apellido, ¿que pasa con la velocidad de la consulta? ¿es recomendable? en la universidad siempre he escuchado algo sobre hacer una tabla indice aparte si no uso los indices que he creado al principio..

Miren por mi no haria una consulta discriminando por un nombre, pero me veo obligado a hacerlo debido a que el campo que capturo viene de un autocompletar.

Por favor necesito toda su sabiduria
  #2 (permalink)  
Antiguo 14/02/2013, 01:32
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: consulta por nombre

sefiroxx,
para eso, para el filtrado de textos, también sirven los índices, es decir, es una de sus funciones principales. Son los campos que aparecen tras el WHERE en búsquedas frecuentes los mejores candidatos para ese tipo de índices. Sin embargo, existen algunos tipos de índices, dependiendo en algún caso del tipo de motor que uses (por ej. el FULL-TEXT en las tablas MyISAM). También la sintaxis de consulta es distinta si buscas un término tal cual en un campo o parte del contenido del campo, puedes hacer un índice compuesto, o aplicarlo solo a un determinado número de caracteres, etc. Luego está la sintaxis a la hora de crearlo, sea al crear la tabla o después de tenerla creada.

Echa primero un vistazo aquí sobre todo lo que tiene que ver con los índices y recorre sus enlaces.

http://dev.mysql.com/doc/refman/5.0/...ate-index.html

Tú, por lo que veo y si se trata de un autocompletado, para la consulta usarás un índice normal BE-TREE y en la consulta usas
SELECT campo FROM tutabla WHERE campo LIKE 'cadena%'

Eso aplicado sobre la columna llamada campo irá lo suficientemente rápido.
  #3 (permalink)  
Antiguo 14/02/2013, 08:40
 
Fecha de Ingreso: febrero-2011
Mensajes: 108
Antigüedad: 13 años, 2 meses
Puntos: 4
Respuesta: consulta por nombre

Haber entonces si creo una tabla de la siguiente forma

Código MySQL:
Ver original
  1. CREATE  TABLE IF NOT EXISTS `base_datos`.`Proveedor` (
  2.  
  3.   `rut` VARCHAR(10) NOT NULL ,
  4.   `nombre` VARCHAR(50) NOT NULL ,
  5.   `giro` VARCHAR(50) NOT NULL ,
  6.   `fono` VARCHAR(12) NOT NULL ,
  7.   `direccion` VARCHAR(50) NOT NULL ,
  8.   `id_comuna` INT NOT NULL ,
  9.   `id_estado` INT NOT NULL ,
  10.  
  11.   PRIMARY KEY (`id`) ,
  12.   CONSTRAINT `fk_proveedor_comuna`
  13.   FOREIGN KEY (`id_comuna` )
  14.   REFERENCES `base_datos`.`Comuna` (`id` )
  15.  
  16.   CONSTRAINT `fk_proveedor_estado`
  17.   FOREIGN KEY (`id_estado` )
  18.   REFERENCES `base_datos`.`Estado` (`id` )
  19.  
  20.  
  21. CREATE INDEX `fk_proveedor_ciudad_idx` ON `base_datos`.`Proveedor` (`id_comuna` ASC) ;
  22. CREATE UNIQUE INDEX `id_UNIQUE` ON `base_datos`.`Proveedor` (`id` ASC) ;
  23. CREATE INDEX `fk_proveedor_estado_idx` ON `base_datos`.`Proveedor` (`id_estado` ASC) ;

Debiera agregar al final de la ultima linea algo asi como

Código MySQL:
Ver original
  1. CREATE INDEX nombre_index USING BTREE ON lookup (nombre);

Y automaticamente la consulta sera mas rapida en una consulta a esa tabla como por ejemplo

Código MySQL:
Ver original
  1. SELECT * FROM proveedor WHERE nombre = 'Comercial Aguita'

Se que no debo usar el asterisco pero solo es por razon de ejemplo, de verdad la consulta seria mas rapido asi???

Última edición por gnzsoloyo; 14/02/2013 a las 10:48
  #4 (permalink)  
Antiguo 14/02/2013, 20:16
 
Fecha de Ingreso: febrero-2011
Mensajes: 108
Antigüedad: 13 años, 2 meses
Puntos: 4
Respuesta: consulta por nombre

Estuve averiguando mucho sobre estos famosos indices y claro que aumentan la velocidad de respuesta de la consulta, pero es mas perceptible mientras mas registros haya en el campo indexado a consultar, me resulta interesante. Ademas se que el primer paso antes de pensar en indices es normalizar bien la base de datos. Bueno volviendo todavia no tengo una respuesta sobre mi post anterior de si resultaria la sentencia que agregaria al momento de crear la tabla, pero ademas quiero anexar dos consultas mas:

1) ¿Seria lo mismo (o esta seria la forma correcta) que si ya tengo la tabla creada poder hacer un ALTER a la misma y crear el indice en nombre de esta forma?:

Código MySQL:
Ver original
  1. ALTER TABLE proveedor ADD INDEX (nombre);

2) Esta duda me surgio en otro post pero me gustaria terminar de resolverla aqui ya que tiene relacion. ¿Es mucha la diferencia en rapidez usar tres consultas para traer datos, que hacer una sola compuesta y que haga lo mismo que las tres consultas (a traves de inner joins o con select anidados). ¿Que se recomienda?
  #5 (permalink)  
Antiguo 15/02/2013, 01:21
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: consulta por nombre

Funcionarán las dos:
Código MySQL:
Ver original
  1. ALTER TABLE nombreTabla ADD INDEX [nombreIndice] (campo1 [,campo2...]);
  2.  
  3. CREATE INDEX nombreIndice ON nombreTabla(campo1 [,campo2...]);

Para que te respondan mejor a la segunda pregunta deberías abrir otro post, y además decir cuáles son las consultas y lo que buscas con ellas. Lo mismo puede resolverse con menos consultas de las que crees. Si pueden hacerse con INNER JOIN, mucho más rápido. la subconsultas con select anidadados habría que verlas. Pero abre un nuevo post con los datos concretos.
  #6 (permalink)  
Antiguo 15/02/2013, 06:52
 
Fecha de Ingreso: febrero-2011
Mensajes: 108
Antigüedad: 13 años, 2 meses
Puntos: 4
Respuesta: consulta por nombre

Gracias otra vez jurena!
Solamente decir cual es el beneficio de esto para que alguien mas que lea el post igual se beneficie:

He utilizado este indice en una tabla con 4000 registros aprox. y sin el indice el tiempo de respuesta de la consulta era de 0,0080 segundos y con el indice bajo considerablemente a 0,0008 segundos. Hay que tener en cuenta que los resultados se notaran mucho mas a medida de que la tabla tenga mas registros

Última edición por sefirotxx; 15/02/2013 a las 07:33

Etiquetas: nombre, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:08.