Cuestión de velocidad de MySQL...

  • WritingBadCode
  • Graduate
  • Graduate
  • Avatar de Usuario
  • Registrado: Abr 28, 2011
  • Mensajes: 214
  • Loc: Sweden
  • Status: Offline

Nota Octubre 8th, 2011, 1:36 pm

Tengo una tabla que normalmente utiliza un ID exclusivo para seleccionar datos (varias entradas).

Código: [ Select ]
SELECT * FROM table WHERE unique_id = $unique_id


Bastante simple. Sin embargo, de vez en cuando no está presente el ID y puedo usar una bruja de palabra se almacena como CHAR (longitud 22) para obtener los mismos datos.

Al llegar los datos de este modo la consulta puede ser algo como esto:
Código: [ Select ]
SELECT * FROM table WHERE word = $someword


bruja devolverá la misma lista.

O podría utilizar 2 consultas:
Código: [ Select ]
SELECT id FROM table WHERE word = $someword

(CODE HERE TO EXTRACT THE ID VALUE)

SELECT * FROM table WHERE id = $id
  1. SELECT id FROM table WHERE word = $someword
  2. (CODE HERE TO EXTRACT THE ID VALUE)
  3. SELECT * FROM table WHERE id = $id


La cosa aquí es utiliza 2 consultas a hacer lo mismo pero selecciona datos mediante un índice de ID (int). Así que qué prefiere, utilizando 2 consultas (uno para obtener el ID (int) y otro para seleccionar datos mediante el ID) o simplemente utilizar una consulta donde los datos están igualadas cadena-tornillo de banco (no está indexado los valores CHAR).
  • Anonymous
  • Bot
  • No Avatar
  • Registrado: 25 Feb 2008
  • Mensajes: ?
  • Loc: Ozzuland
  • Status: Online

Nota Octubre 8th, 2011, 1:36 pm

  • SpooF
  • ٩๏̯͡๏۶
  • Bronze Member
  • Avatar de Usuario
  • Registrado: May 22, 2004
  • Mensajes: 3415
  • Loc: Richland, WA
  • Status: Offline

Nota Octubre 8th, 2011, 1:48 pm

Si la primera consulta utilizando la palabra obtiene la misma fila no hay ninguna razón para que se ejecute a la segunda. Una cosa es acelerar la consulta es hacer un índice en el campo palabra.
#define NULL (::rand() % 2)
  • WritingBadCode
  • Graduate
  • Graduate
  • Avatar de Usuario
  • Registrado: Abr 28, 2011
  • Mensajes: 214
  • Loc: Sweden
  • Status: Offline

Nota Octubre 8th, 2011, 1:58 pm

SpooF escribió:
Si la primera consulta utilizando la palabra obtiene la misma fila no hay ninguna razón para que se ejecute a la segunda. Una cosa es acelerar la consulta es hacer un índice en el campo palabra.



Hay no una fila (o sea), pero más común sería 5-40. ¿En cuanto a los índices que utiliza 2 ya (para las dos funciones más comunes), pueden muchos índices ralentizarlo o diría que está bien tener más de 2 índices en la misma mesa?:o
  • Bigwebmaster
  • Site Admin
  • Site Admin
  • Avatar de Usuario
  • Registrado: Dic 20, 2002
  • Mensajes: 8925
  • Loc: Seattle, WA & Phoenix, AZ
  • Status: Offline

Nota Octubre 9th, 2011, 2:07 pm

Si lo estoy entendiendo correctamente creo que siempre sólo podía hacer una consulta. En los casos donde hay que buscar el id en primer lugar, en vez de hacer dos consultas, por qué solo podría no escribir una consulta modificada cuando se combinan dos tablas (si es necesario), o simplemente cambiar la consulta si su utilizando la misma mesa a buscar por palabra clave en lugar de id. Todo lo que necesita hacer es utilizar un si otra declaración para ejecutar diferentes consultas si el ID es falta.

La principal desventaja de índices en mi opinión sería si constantemente están escribiendo a la base de datos y cambiar valores que afecten a ese índice, frente a la lectura desde la base de datos. Índices de acelerar la recuperación de la información, pero ralentizan las inserciones y eliminaciones, así como versiones de valores en las columnas indizadas. Así como estás leyendo desde la base de datos mucho más que escribir a ella, índices son generalmente positivo si se utilizan correctamente.
Ozzu Hosting - Want your website on a fast server like Ozzu?
  • WritingBadCode
  • Graduate
  • Graduate
  • Avatar de Usuario
  • Registrado: Abr 28, 2011
  • Mensajes: 214
  • Loc: Sweden
  • Status: Offline

Nota Octubre 11th, 2011, 7:47 pm

Lo siento por todo el trabajo de adivinar. Debo haber publicado esto directamente, de todos modos la tabla está estructurada como este:

Código: [ Select ]
unique_id (int(10) unsigned, NOT NULL AUTO_INCREMENT, PRIMARY KEY(index))
u_id (int(10) unsigned, NOT NULL, KEY(index))
word (char(22), not indexed)
text (text, not indexed)
  1. unique_id (int(10) unsigned, NOT NULL AUTO_INCREMENT, PRIMARY KEY(index))
  2. u_id (int(10) unsigned, NOT NULL, KEY(index))
  3. word (char(22), not indexed)
  4. text (text, not indexed)


Normalmente utilizo "u_id" a la información instantánea y su común también que agarra datos mediante el "unique_id", pero ahora y entonces tengo que agarro con la palabra thing(for usability). Varios puestos pueden tener la u_id misma (estos puestos también comparte la misma palabra), para ser más claro: u_id significa user_id.

Era lo que estaba pensando, permite decir que pueblan esta lista. ¿Es más rápido para extraer solo u_id con la cosa de palabra y luego coinciden con los restantes registra con lo u_id que al ponerlas todas con coincidencia de palabra a palabra?

El motivo de mi pregunta es que Ive escuchado que cadena coincidente es muy lenta en comparación con coincidencia int (número). Sin embargo creo que hay también es algún procesamiento en la adopción de un valor y luego extraerlo y volver en la base de datos para obtener el resto, también gracias a la entrada. : )
  • Bigwebmaster
  • Site Admin
  • Site Admin
  • Avatar de Usuario
  • Registrado: Dic 20, 2002
  • Mensajes: 8925
  • Loc: Seattle, WA & Phoenix, AZ
  • Status: Offline

Nota Octubre 12th, 2011, 2:57 pm

Quote:
¿Es más rápido para extraer solo u_id con la cosa de palabra y luego coinciden con los restantes registra con lo u_id que al ponerlas todas con coincidencia de palabra a palabra?


Si usted se refiere a la creación de una instrucción SQL que encuentra un ID emparejando con una palabra, esto no es diferente de encontrar todas las líneas que coinciden con esa palabra. Al ejecutar la instrucción SQL que trata de hacer coincidir a esa palabra, tendría que buscar todos los registros de todas formas que le devolverá la lista de todos los u_ids que coinciden con esa palabra. Por lo que no tiene sentido analizar sólo uno de los valores de los resultados devueltos cuando ya tienes disponibles para usted.

¿No estoy seguro que si me falta algo aquí, pero si usted ha buscado por la palabra frikis ser obtener una lista de todos los resultados que desea de todos modos?
Ozzu Hosting - Want your website on a fast server like Ozzu?
  • WritingBadCode
  • Graduate
  • Graduate
  • Avatar de Usuario
  • Registrado: Abr 28, 2011
  • Mensajes: 214
  • Loc: Sweden
  • Status: Offline

Nota Octubre 13th, 2011, 6:17 am

Bigwebmaster escribió:
Quote:
¿Es más rápido para extraer solo u_id con la cosa de palabra y luego coinciden con los restantes registra con lo u_id que al ponerlas todas con coincidencia de palabra a palabra?


Si usted se refiere a la creación de una instrucción SQL que encuentra un ID emparejando con una palabra, esto no es diferente de encontrar todas las líneas que coinciden con esa palabra. Al ejecutar la instrucción SQL que trata de hacer coincidir a esa palabra, tendría que buscar todos los registros de todas formas que le devolverá la lista de todos los u_ids que coinciden con esa palabra. Por lo que no tiene sentido analizar sólo uno de los valores de los resultados devueltos cuando ya tienes disponibles para usted.

¿No estoy seguro que si me falta algo aquí, pero si usted ha buscado por la palabra frikis ser obtener una lista de todos los resultados que desea de todos modos?


Mi mala - he sido difícil de leer y entender con mi explicación, estaba pensando en algo parecido a esto:

Código: [ Select ]
SELECT u_id FROM table WHERE word = $someword LIMIT 1


Debe obtener un valor y luego detener si no me equivoco. Y, a continuación, podría seguir con u_id para la selección.

De todos modos, que pueda tener sobre pensamiento este problema. Desde la base de datos es todavía no está activo suficiente para traer cualquier retraso para hablar sobre el uso de cualquiera de las técnicas.

Supongo que no hay nada malo en tratar de prever problemas pero quizás debo poner más atención y volver y bump esto si realmente surgen problemas. Hmm.
  • Bigwebmaster
  • Site Admin
  • Site Admin
  • Avatar de Usuario
  • Registrado: Dic 20, 2002
  • Mensajes: 8925
  • Loc: Seattle, WA & Phoenix, AZ
  • Status: Offline

Nota Octubre 13th, 2011, 9:53 am

Usando el límite de 1 puede devolver un resultado, pero la misma consulta está haciendo la misma cantidad de trabajo incluso como si no tuviera ningún límite. Para probar esto hice una instrucción SELECT en una de mis tablas en mi base de datos:

SQL Código: [ Select ]
SELECT * FROM `table` LIMIT 1


y que devuelve uno de los resultados de la tabla que tiene miles y miles de entradas. Ahora si lo hago:

SQL Código: [ Select ]
EXPLAIN SELECT * FROM `table` LIMIT 1


El resultado es:

ID: 1
select_type: simple
tabla: tabla
tipo: todos
claves posibles: NULL
clave: NULL
key_len: NULL
Ref: NULL
filas: 35416

La parte importante que es lo que dice de las filas. La consulta todavía tenía que buscar a través de todos los 35416 registros para devolver un resultado. Lo muestra que usando un límite no realmente hacer la consulta más eficiente.
Ozzu Hosting - Want your website on a fast server like Ozzu?
  • WritingBadCode
  • Graduate
  • Graduate
  • Avatar de Usuario
  • Registrado: Abr 28, 2011
  • Mensajes: 214
  • Loc: Sweden
  • Status: Offline

Nota Octubre 14th, 2011, 2:54 am

Bigwebmaster escribió:
Usando el límite de 1 puede devolver un resultado, pero la misma consulta está haciendo la misma cantidad de trabajo incluso como si no tuviera ningún límite. Para probar esto hice una instrucción SELECT en una de mis tablas en mi base de datos:

SQL Código: [ Select ]
SELECT * FROM `table` LIMIT 1


y que devuelve uno de los resultados de la tabla que tiene miles y miles de entradas. Ahora si lo hago:

SQL Código: [ Select ]
EXPLAIN SELECT * FROM `table` LIMIT 1


El resultado es:

ID: 1
select_type: simple
tabla: tabla
tipo: todos
claves posibles: NULL
clave: NULL
key_len: NULL
Ref: NULL
filas: 35416

La parte importante que es lo que dice de las filas. La consulta todavía tenía que buscar a través de todos los 35416 registros para devolver un resultado. Lo muestra que usando un límite no realmente hacer la consulta más eficiente.


WoW, eso es gracioso. :) Me imagino que desde un aspecto de rendimiento mediante una única consulta es lo correcto a hacer entonces - gracias!:D

Publicar Información

  • Total de mensajes en este tema: 9 mensajes
  • Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 257 invitados
  • No puede abrir nuevos temas en este Foro
  • No puede responder a temas en este Foro
  • No puede editar sus mensajes en este Foro
  • No puede borrar sus mensajes en este Foro
  • No puede enviar adjuntos en este Foro
 
 

© 2011 Unmelted, LLC. Ozzu® es una marca registrada de Unmelted, LLC