Tengo una tabla con más de 100 millones de filas en Innodb.Rendimiento de recuento Mysql en tablas muy grandes
Tengo que saber si hay más de 5000 filas donde la clave externa = 1. No necesito el número exacto.
Hice algunas pruebas:
SELECT COUNT(*) FROM table WHERE fk = 1
=> 16 segundos
SELECT COUNT(*) FROM table WHERE fk = 1 LIMIT 5000
=> 16 segundos
SELECT primary FROM table WHERE fk = 1
=> 0,6 segundos
voy a tener una red más grande y tiempo de tratamiento pero puede ser una sobrecarga de 15.4 segundos!
¿Tiene una mejor idea?
Gracias
Editar: [observaciones pertinentes del Agregado OP]
que probé SELECT SQL_NO_CACHE COUNT (FK) FROM tabla WHERE fk = 1 pero tardó 25 segundos
Mysql se ajustaba para una Innodb con Mysql Tuner.
CREATE TABLE table (pk bigint(20) NOT NULL AUTO_INCREMENT,
fk tinyint(3) unsigned DEFAULT '0',
PRIMARY KEY (pk), KEY idx_fk (fk) USING BTREE)
ENGINE=InnoDB AUTO_INCREMENT=100380914 DEFAULT CHARSET=latin1
DB cosas:
'have_innodb', 'YES' 'ignore_builtin_innodb', 'OFF' 'innodb_adaptive_hash_index', 'ON'
'innodb_additional_mem_pool_size', '20971520' 'innodb_autoextend_increment', '8'
'innodb_autoinc_lock_mode', '1' 'innodb_buffer_pool_size', '25769803776'
'innodb_checksums', 'ON' 'innodb_commit_concurrency', '0',
'innodb_concurrency_tickets', '500' 'innodb_data_file_path',
'ibdata1:10M:autoextend' 'innodb_data_home_dir', '', 'innodb_doublewrite', 'ON'
'innodb_fast_shutdown', '1' 'innodb_file_io_threads', '4'
'innodb_file_per_table', 'OFF', 'innodb_flush_log_at_trx_commit', '1'
'innodb_flush_method', '' 'innodb_force_recovery', '0' 'innodb_lock_wait_timeout', '50'
'innodb_locks_unsafe_for_binlog', 'OFF' 'innodb_log_buffer_size', '8388608'
'innodb_log_file_size', '26214400' 'innodb_log_files_in_group', '2'
'innodb_log_group_home_dir', './' 'innodb_max_dirty_pages_pct', '90'
'innodb_max_purge_lag', '0' 'innodb_mirrored_log_groups', '1' 'innodb_open_files',
'300' 'innodb_rollback_on_timeout', 'OFF' 'innodb_stats_on_metadata', 'ON'
'innodb_support_xa', 'ON' 'innodb_sync_spin_loops', '20' 'innodb_table_locks', 'ON'
'innodb_thread_concurrency', '8' 'innodb_thread_sleep_delay', '10000'
'innodb_use_legacy_cardinality_algorithm', 'ON'
actualización '15: que utiliza el mismo método hasta ahora con 600 millones de filas y 640 000 nuevas filas por día. Todavía funciona bien.
el recuento iría más rápido si selecciona una columna en 'COUNT()', como tal: 'SELECT COUNT (fk) FROM tabla DONDE fk = 1' – ClydeFrog
echa un vistazo a [este sitio web] (http : //www.mysqlperformanceblog.com/2007/04/10/count-vs-countcol/) para más información – ClydeFrog
@ClydeFrog: ¿De verdad? De acuerdo con [el manual] (http://dev.mysql.com/doc/en/group-by-functions.html#function_count), * 'COUNT (*)' está optimizado para regresar muy rápido si el 'SELECT' recupera de una tabla, no se recuperan otras columnas, y no hay una cláusula 'WHERE' *. De hecho, el blog al que vinculó sugiere que 'COUNT (*)' es más rápido que 'COUNT (columna)'. – eggyal