2011-08-11 12 views
6

Tenemos una tabla que actualmente tiene una columna de TEXTO y la longitud promedio de la columna es de aproximadamente 2.000 caracteres. Queríamos ver cuál sería el rendimiento de las consultas que seleccionarían esa columna si el promedio fuera 5k, 10k, 20k, etc.El tiempo de consulta de MySQL crece exponencialmente cuando los datos en la columna TEXT crecen linealmente

Configuramos una prueba aislada y encontramos que a medida que la longitud de la columna TEXT aumentaba linealmente, el tiempo de consulta aumentó exponencialmente.

Alguien tiene alguna idea rápida de por qué esto podría ser. Puede proporcionar más información, pero bastante sencillo.

+0

¿Ha usado un índice de texto completo en combinación con 'match against'. Esta es la forma recomendada de buscar las columnas de texto. – Johan

+0

No estamos buscando en la columna TEXTO, simplemente seleccionándolo.SELECCIONAR * FROM t DONDE t.id <50; etc. –

+0

SELECCIONAR * es muy malo, solo selecciona los campos que realmente necesitas. Porque está (potencialmente) enviando muchos datos innecesarios a través del cable. Además, si estás usando InnoDB, estás eliminando la oportunidad de usar índices de cobertura, también ten en cuenta la respuesta de @Mchl. – Johan

Respuesta

1

Una de las razones podría ser porque los campos TEXT y BLOB no se almacenan junto con todos los demás campos 'normales', por lo que el motor de base de datos realmente necesita extraerlos de otra área del disco.

Necesitaríamos ver su consulta ¿Es solo un campo de búsqueda por ID, o busca en el campo TEXT? En el último caso, como la longitud promedio del texto almacenado aumenta, también lo hace la cantidad de datos para que la base de datos procese y crece exponencialmente.

+0

sí, pero ¿por qué exponencialmente? –

+0

... no, no es exponencial ... Estaba equivocado al respecto. Imaginé algo más en mi mente, pero cuando comencé a calcularlo, sigue siendo lineal; P – Mchl

+0

Nuestra prueba aislada es una tabla con 2 columnas: una identificación y una columna de TEXTO. Nuestra consulta es seleccionar de la tabla por id en incrementos de 50. Digamos que tiene 1000 filas que haremos 0

0

Sólo puede seleccionar estos campos que desea ver mediante limit:

SELECT field1, f2, f3 FROM table1 ORDER BY id LIMIT 0,30 

Durante los siguientes 30 filas haces

SELECT field1, f2, f3 FROM table1 ORDER BY id LIMIT 30,30 

Nunca se puede leer 10k filas de una sola vez de todos modos, esto hará que tus selecciones sean mucho más rápidas.

0

esto está relacionado con la cantidad de datos pueden MySQL leen durante un ciclo de lectura de disco,
y cuántos datos se pueden enviar por la red en un envío de datos ciclo

cuando el crecimiento del tamaño de los datos, más los gastos generales será en

  • ciclo de lectura de disco (MySQL pasó más tiempo en la búsqueda de registro)
  • de envío de datos (más de los ciclos para permitir la transferencia de datos a través de la red)

no todos los datos se almacenan en la memoria, especialmente en el texto y representación de nota,
MySQL tiene que encontrar los datos desde el disco,
y transferir de nuevo a los clientes

en otras palabras, el índice de MySQL es rápido,
ya que no requiere lectura de disco

+0

Estoy de acuerdo con su análisis, pero me gustaría una forma de probarlo ... –

+0

comparar la tasa de lectura/escritura del disco – ajreal

0

esta es una suposición muy salvaje, pero esto podría ser un problema de puesta en práctica bajo nivel, MySql no espera que para recuperar tantos datos a la vez lo que tiene que reasignar un bloque grande de memoria para su uso interno y copie los datos de la ubicación anterior a la nueva y repita esto en un una vez más a medida que crecen los datos, esto es lo único que se me viene a la mente que puede explicar que el tiempo de consulta aumente exponencialmente mientras los datos crecen linealmente. Su solución es limitar la cantidad de datos que recupera a la vez.

Cuestiones relacionadas