2010-02-01 24 views
17

Estoy haciendo una consulta "select sum (foo) from bar" en una base de datos MySQL que resume los registros de 7.3mm y tarda unos 22 segundos por ejecución. ¿Hay algún truco para acelerar las sumas en MySQL?¿Es posible acelerar una suma() en MySQL?

+0

Es posible en otras bases de datos sin embargo; ex. [Oracle] (http://en.wikipedia.org/wiki/Materialized_view), [MS SQL] (http://technet.microsoft.com/library/Cc917715), –

Respuesta

24

No, no puede acelerar la función en sí. El problema aquí es que estás seleccionando 7.3 millones de registros. MySQL tiene que escanear toda la tabla, y 7.3 millones es un número bastante grande. Estoy impresionado de que termine tan rápido, en realidad.

Una estrategia que podría emplear sería dividir sus datos en subconjuntos más pequeños (quizás por fecha? Mes?) Y mantener una suma total de datos antiguos que no va a cambiar. Puede actualizar periódicamente la suma, y ​​el valor total se puede calcular sumando la suma y cualquier dato nuevo que se haya agregado desde entonces, que será un número mucho más pequeño de filas.

3

No, realmente no. Siempre tendrá que enumerar todas las filas en la tabla.

¿Podría crear una tabla adicional y actualizar la suma allí en cada inserción, actualización, eliminación?

0

Si la consulta es realmente así de simple, sin ... pero si que está utilizando una consulta más compleja (y abreviado aquí) que podría (probablemente) - como usar mejor se une ...

9

Turn en QUERY CACHE en mysql. El almacenamiento en caché está DESACTIVADO por defecto. Necesita establecer el archivo mysql ini.

-- hint mysql server about caching 
SELECT SQL_CACHE sum(foo) FROM bar; 

MySQL optimizer puede devolver una caché si no se realizaron cambios en la tabla.

leer más aquí: http://www.mysqlperformanceblog.com/2006/07/27/mysql-query-cache/

+0

¿Se actualizará el valor guardado en caché cuando un valor de 'foo' se actualiza? ¿O MySQL simplemente volverá a sumar toda la tabla la próxima vez que se ejecute esta consulta? –

+1

@ BlueRaja-DannyPflughoeft el caché se borrará y volverá a sumar toda la tabla. –

1

probablemente puede intentar añadir un índice en el campo bar.foo. El índice contendrá todos los valores de la columna de la barra, pero es más pequeño y más rápido de escanear que la tabla foo original, especialmente si foo tiene muchas otras columnas.

+0

error solucionado al referirse a la columna. debería ser bar.foo, no foo.bar. gracias a @ harry-b – hongliang

8

dos cosas aquí:

1) No debe hacer la suma de 7,3 millones de registros de manera regular - introducir tablas de fases que sirven las necesidades del negocio (por día, mes, año, departamento, etc.) y llenarlos de de forma programada, posiblemente reutilizar esas tablas en lugar de tabla original 'en bruto' (como seleccionar valor resumido para cada día cuando se necesita unos pocos días de intervalo, etc.)

2) comprobar su transacción settings

http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html#isolevel_repeatable-read

Cuestiones relacionadas