MySQL InnoDB查询性能

MySQL InnoDB查询性能,mysql,performance,innodb,myisam,Mysql,Performance,Innodb,Myisam,我正在尝试优化一个简单的sql查询,它将在大量数据上运行很多次 这是一个场景: 使用InnoDB表的MySQL where和join中使用的所有字段都编制了索引。表具有FK 我不需要查询的整个缓存,但可能需要每个表的缓存 表具有更多更新/插入的读取 真正的疑问: SELECT one_field, another_field FROM big_table INNER JOIN medium_table ON ( ... ) INNER JOIN small_table ON ( ...

我正在尝试优化一个简单的sql查询,它将在大量数据上运行很多次

这是一个场景:

  • 使用InnoDB表的MySQL
  • where和join中使用的所有字段都编制了索引。表具有FK
  • 我不需要查询的整个缓存,但可能需要每个表的缓存
  • 表具有更多更新/插入的读取
真正的疑问:

SELECT one_field, another_field
FROM big_table 
INNER JOIN medium_table ON ( ... ) 
INNER JOIN small_table ON ( ... ) 
WHERE week >= #number AND week <= #number AND year >= #number AND year <= #number 
AND medium_table.indexed_field = #number
AND small_table.pk= #number
失去FKs去MyISAM值得吗

谢谢


更新:

auto_increment_increment    1
auto_increment_offset   1
automatic_sp_privileges ON
back_log    50
basedir /usr/
bdb_cache_size  8384512
bdb_home    /var/lib/mysql/
bdb_log_buffer_size 262144
bdb_logdir  
bdb_max_lock    10000
bdb_shared_data OFF
bdb_tmpdir  /tmp/
binlog_cache_size   32768
bulk_insert_buffer_size 8388608
character_set_client    utf8
character_set_connection    utf8
character_set_database  latin1
character_set_filesystem    binary
character_set_results   utf8
character_set_server    latin1
character_set_system    utf8
character_sets_dir  /usr/share/mysql/charsets/
collation_connection    utf8_general_ci
collation_database  latin1_swedish_ci
collation_server    latin1_swedish_ci
completion_type 0
concurrent_insert   1
connect_timeout 10
datadir /var/lib/mysql/
date_format %Y-%m-%d
datetime_format %Y-%m-%d %H:%i:%s
default_week_format 0
delay_key_write ON
delayed_insert_limit    100
delayed_insert_timeout  300
delayed_queue_size  1000
div_precision_increment 4
keep_files_on_create    OFF
engine_condition_pushdown   OFF
expire_logs_days    0
flush   OFF
flush_time  0
ft_boolean_syntax   + -><()~*:""&|
ft_max_word_len 84
ft_min_word_len 4
ft_query_expansion_limit    20
ft_stopword_file    (built-in)
group_concat_max_len    1024
have_archive    NO
have_bdb    YES
have_blackhole_engine   NO
have_compress   YES
have_crypt  YES
have_csv    NO
have_dynamic_loading    YES
have_example_engine NO
have_federated_engine   NO
have_geometry   YES
have_innodb YES
have_isam   NO
have_merge_engine   YES
have_ndbcluster NO
have_openssl    DISABLED
have_ssl    DISABLED
have_query_cache    YES
have_raid   NO
have_rtree_keys YES
have_symlink    YES
hostname    EarnedBE002
init_connect    
init_file   
init_slave  
innodb_additional_mem_pool_size 1048576
innodb_autoextend_increment 8
innodb_buffer_pool_awe_mem_mb   0
innodb_buffer_pool_size 8388608
innodb_checksums    ON
innodb_commit_concurrency   0
innodb_concurrency_tickets  500
innodb_data_file_path   ibdata1:10M:autoextend
innodb_data_home_dir    
innodb_adaptive_hash_index  ON
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_arch_dir 
innodb_log_archive  OFF
innodb_log_buffer_size  1048576
innodb_log_file_size    5242880
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_support_xa   ON
innodb_sync_spin_loops  20
innodb_table_locks  ON
innodb_thread_concurrency   8
innodb_thread_sleep_delay   10000
interactive_timeout 28800
join_buffer_size    131072
key_buffer_size 8384512
key_cache_age_threshold 300
key_cache_block_size    1024
key_cache_division_limit    100
language    /usr/share/mysql/english/
large_files_support ON
large_page_size 0
large_pages OFF
lc_time_names   en_US
license GPL
local_infile    ON
locked_in_memory    OFF
log OFF
log_bin OFF
log_bin_trust_function_creators OFF
log_error   
log_queries_not_using_indexes   OFF
log_slave_updates   OFF
log_slow_queries    OFF
log_warnings    1
long_query_time 10
low_priority_updates    OFF
lower_case_file_system  OFF
lower_case_table_names  0
max_allowed_packet  1048576
max_binlog_cache_size   18446744073709547520
max_binlog_size 1073741824
max_connect_errors  10
max_connections 100
max_delayed_threads 20
max_error_count 64
max_heap_table_size 16777216
max_insert_delayed_threads  20
max_join_size   18446744073709551615
max_length_for_sort_data    1024
max_prepared_stmt_count 16382
max_relay_log_size  0
max_seeks_for_key   18446744073709551615
max_sort_length 1024
max_sp_recursion_depth  0
max_tmp_tables  32
max_user_connections    0
max_write_lock_count    18446744073709551615
multi_range_count   256
myisam_data_pointer_size    6
myisam_max_sort_file_size   9223372036853727232
myisam_recover_options  OFF
myisam_repair_threads   1
myisam_sort_buffer_size 8388608
myisam_stats_method nulls_unequal
net_buffer_length   16384
net_read_timeout    30
net_retry_count 10
net_write_timeout   60
new OFF
old_passwords   OFF
open_files_limit    1024
optimizer_prune_level   1
optimizer_search_depth  62
pid_file    /var/run/mysqld/mysqld.pid
plugin_dir  
port    3306
preload_buffer_size 32768
profiling   OFF
profiling_history_size  15
protocol_version    10
query_alloc_block_size  8192
query_cache_limit   1048576
query_cache_min_res_unit    4096
query_cache_size    0
query_cache_type    ON
query_cache_wlock_invalidate    OFF
query_prealloc_size 8192
range_alloc_block_size  4096
read_buffer_size    131072
read_only   OFF
read_rnd_buffer_size    262144
relay_log   
relay_log_index 
relay_log_info_file relay-log.info
relay_log_purge ON
relay_log_space_limit   0
rpl_recovery_rank   0
secure_auth OFF
secure_file_priv    
server_id   0
skip_external_locking   ON
skip_networking OFF
skip_show_database  OFF
slave_compressed_protocol   OFF
slave_load_tmpdir   /tmp/
slave_net_timeout   3600
slave_skip_errors   OFF
slave_transaction_retries   10
slow_launch_time    2
socket  /var/lib/mysql/mysql.sock
sort_buffer_size    2097144
sql_big_selects ON
sql_mode    
sql_notes   ON
sql_warnings    OFF
ssl_ca  
ssl_capath  
ssl_cert    
ssl_cipher  
ssl_key 
storage_engine  MyISAM
sync_binlog 0
sync_frm    ON
system_time_zone    UTC
table_cache 64
table_lock_wait_timeout 50
table_type  MyISAM
thread_cache_size   0
thread_stack    262144
time_format %H:%i:%s
time_zone   SYSTEM
timed_mutexes   OFF
tmp_table_size  33554432
tmpdir  /tmp/
transaction_alloc_block_size    8192
transaction_prealloc_size   4096
tx_isolation    REPEATABLE-READ
updatable_views_with_limit  YES
version 5.0.77
version_bdb Sleepycat Software: Berkeley DB 4.1.24: (January 29, 2009)
version_comment Source distribution
version_compile_machine x86_64
version_compile_os  redhat-linux-gnu
wait_timeout    28800
解释选择的原因:

1   SIMPLE  small_table const   PRIMARY PRIMARY 4   const   1   Using index
1   SIMPLE  medium_table    index_merge PRIMARY,Fk_small_table, Fk_indexed_field    Fk_small_table, Fk_indexed_field    5,5     250 Using intersect(Fk_small_table, Fk_indexed_field); Using where
1   SIMPLE  big_table   ref Fk_code_of_medium_table,week-year-compound-index    Fk_three    5   medium_table.primary_key    4   Using where
数据库模式:

CREATE  TABLE IF NOT EXISTS `db`.`big_table` (
  `primary_key` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `code_of_medium_table` INT UNSIGNED NULL ,
  `week` SMALLINT UNSIGNED NULL ,
  `year` YEAR NULL ,
   ......
  PRIMARY KEY (`primary_key`) ,
  INDEX `Fk_code_of_medium_table` (`code_of_medium_table` ASC) ,
  INDEX `In_week-year` (`week` ASC, `year` ASC) ,
  CONSTRAINT `Fk_code_of_medium_table`
    FOREIGN KEY (`code_of_medium_table` )
    REFERENCES `db`.`medium_table` (`code` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
ENGINE = InnoDB


CREATE  TABLE IF NOT EXISTS `db`.`medium_table` (
  `primary_key` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  .....
  `code_of_small_table` INT UNSIGNED NULL ,
  `indexed_field ` INT UNSIGNED NULL ,
  PRIMARY KEY (`primary_key`) ,
  INDEX `Fk_code_of_small_table` (`code_of_small_table` ASC) ,
  INDEX `Fk_indexed_field` (`another_field` ASC) ,
  CONSTRAINT `Fk_code_of_small_table`
    FOREIGN KEY (`code_of_small_table` )
    REFERENCES `db`.`small_table` (`code` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `Fk_indexed_field `
    FOREIGN KEY (`indexed_field ` )
    REFERENCES `db`.`other_table` (`code` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB


CREATE  TABLE IF NOT EXISTS `db`.`small_table` (
  `primary_key` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  .....
  PRIMARY KEY (`primary_key`) )
ENGINE = InnoDB
变量输出:

auto_increment_increment    1
auto_increment_offset   1
automatic_sp_privileges ON
back_log    50
basedir /usr/
bdb_cache_size  8384512
bdb_home    /var/lib/mysql/
bdb_log_buffer_size 262144
bdb_logdir  
bdb_max_lock    10000
bdb_shared_data OFF
bdb_tmpdir  /tmp/
binlog_cache_size   32768
bulk_insert_buffer_size 8388608
character_set_client    utf8
character_set_connection    utf8
character_set_database  latin1
character_set_filesystem    binary
character_set_results   utf8
character_set_server    latin1
character_set_system    utf8
character_sets_dir  /usr/share/mysql/charsets/
collation_connection    utf8_general_ci
collation_database  latin1_swedish_ci
collation_server    latin1_swedish_ci
completion_type 0
concurrent_insert   1
connect_timeout 10
datadir /var/lib/mysql/
date_format %Y-%m-%d
datetime_format %Y-%m-%d %H:%i:%s
default_week_format 0
delay_key_write ON
delayed_insert_limit    100
delayed_insert_timeout  300
delayed_queue_size  1000
div_precision_increment 4
keep_files_on_create    OFF
engine_condition_pushdown   OFF
expire_logs_days    0
flush   OFF
flush_time  0
ft_boolean_syntax   + -><()~*:""&|
ft_max_word_len 84
ft_min_word_len 4
ft_query_expansion_limit    20
ft_stopword_file    (built-in)
group_concat_max_len    1024
have_archive    NO
have_bdb    YES
have_blackhole_engine   NO
have_compress   YES
have_crypt  YES
have_csv    NO
have_dynamic_loading    YES
have_example_engine NO
have_federated_engine   NO
have_geometry   YES
have_innodb YES
have_isam   NO
have_merge_engine   YES
have_ndbcluster NO
have_openssl    DISABLED
have_ssl    DISABLED
have_query_cache    YES
have_raid   NO
have_rtree_keys YES
have_symlink    YES
hostname    EarnedBE002
init_connect    
init_file   
init_slave  
innodb_additional_mem_pool_size 1048576
innodb_autoextend_increment 8
innodb_buffer_pool_awe_mem_mb   0
innodb_buffer_pool_size 8388608
innodb_checksums    ON
innodb_commit_concurrency   0
innodb_concurrency_tickets  500
innodb_data_file_path   ibdata1:10M:autoextend
innodb_data_home_dir    
innodb_adaptive_hash_index  ON
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_arch_dir 
innodb_log_archive  OFF
innodb_log_buffer_size  1048576
innodb_log_file_size    5242880
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_support_xa   ON
innodb_sync_spin_loops  20
innodb_table_locks  ON
innodb_thread_concurrency   8
innodb_thread_sleep_delay   10000
interactive_timeout 28800
join_buffer_size    131072
key_buffer_size 8384512
key_cache_age_threshold 300
key_cache_block_size    1024
key_cache_division_limit    100
language    /usr/share/mysql/english/
large_files_support ON
large_page_size 0
large_pages OFF
lc_time_names   en_US
license GPL
local_infile    ON
locked_in_memory    OFF
log OFF
log_bin OFF
log_bin_trust_function_creators OFF
log_error   
log_queries_not_using_indexes   OFF
log_slave_updates   OFF
log_slow_queries    OFF
log_warnings    1
long_query_time 10
low_priority_updates    OFF
lower_case_file_system  OFF
lower_case_table_names  0
max_allowed_packet  1048576
max_binlog_cache_size   18446744073709547520
max_binlog_size 1073741824
max_connect_errors  10
max_connections 100
max_delayed_threads 20
max_error_count 64
max_heap_table_size 16777216
max_insert_delayed_threads  20
max_join_size   18446744073709551615
max_length_for_sort_data    1024
max_prepared_stmt_count 16382
max_relay_log_size  0
max_seeks_for_key   18446744073709551615
max_sort_length 1024
max_sp_recursion_depth  0
max_tmp_tables  32
max_user_connections    0
max_write_lock_count    18446744073709551615
multi_range_count   256
myisam_data_pointer_size    6
myisam_max_sort_file_size   9223372036853727232
myisam_recover_options  OFF
myisam_repair_threads   1
myisam_sort_buffer_size 8388608
myisam_stats_method nulls_unequal
net_buffer_length   16384
net_read_timeout    30
net_retry_count 10
net_write_timeout   60
new OFF
old_passwords   OFF
open_files_limit    1024
optimizer_prune_level   1
optimizer_search_depth  62
pid_file    /var/run/mysqld/mysqld.pid
plugin_dir  
port    3306
preload_buffer_size 32768
profiling   OFF
profiling_history_size  15
protocol_version    10
query_alloc_block_size  8192
query_cache_limit   1048576
query_cache_min_res_unit    4096
query_cache_size    0
query_cache_type    ON
query_cache_wlock_invalidate    OFF
query_prealloc_size 8192
range_alloc_block_size  4096
read_buffer_size    131072
read_only   OFF
read_rnd_buffer_size    262144
relay_log   
relay_log_index 
relay_log_info_file relay-log.info
relay_log_purge ON
relay_log_space_limit   0
rpl_recovery_rank   0
secure_auth OFF
secure_file_priv    
server_id   0
skip_external_locking   ON
skip_networking OFF
skip_show_database  OFF
slave_compressed_protocol   OFF
slave_load_tmpdir   /tmp/
slave_net_timeout   3600
slave_skip_errors   OFF
slave_transaction_retries   10
slow_launch_time    2
socket  /var/lib/mysql/mysql.sock
sort_buffer_size    2097144
sql_big_selects ON
sql_mode    
sql_notes   ON
sql_warnings    OFF
ssl_ca  
ssl_capath  
ssl_cert    
ssl_cipher  
ssl_key 
storage_engine  MyISAM
sync_binlog 0
sync_frm    ON
system_time_zone    UTC
table_cache 64
table_lock_wait_timeout 50
table_type  MyISAM
thread_cache_size   0
thread_stack    262144
time_format %H:%i:%s
time_zone   SYSTEM
timed_mutexes   OFF
tmp_table_size  33554432
tmpdir  /tmp/
transaction_alloc_block_size    8192
transaction_prealloc_size   4096
tx_isolation    REPEATABLE-READ
updatable_views_with_limit  YES
version 5.0.77
version_bdb Sleepycat Software: Berkeley DB 4.1.24: (January 29, 2009)
version_comment Source distribution
version_compile_machine x86_64
version_compile_os  redhat-linux-gnu
wait_timeout    28800
(已编辑)

一个
(年,周)
(周,年)
索引在
big\u表
中肯定会对这个查询有所帮助

我看你已经有第二个了,
(周,年)
。我更喜欢第一个问题,但对于这个问题,如果有的话,也没有多大区别


我想补充:

  • 综合指数
    (中表代码,年,周)
    大表中

  • 复合索引
    (小型表的代码,索引字段)
    位于
    中型表中。

你能试一下并再次发布查询计划吗



或者
(年、周、中表的代码)
(索引字段、小表的代码)

我希望您能找到我感兴趣的以下链接和以前的答案

我希望我能为您的问题提供一个具体的答案,但我没有时间完全了解您的模式:命名约定太糟糕,缺少有用的信息,不一致等等

但是,您应该在下面找到问题的解决方案,这与切换到性能较差的myisam引擎无关

以下答案之一的一个片段:

您应该阅读下面的内容,了解一下设计良好的innodb表的优点,以及如何最好地使用聚集索引—仅在innodb中可用

聚集索引:

我以前的回答是:


希望这有帮助:)

为查询中的所有表发布SHOW CREATE TABLE的输出、EXPLAIN SELECT的输出以及您对InnoDB的配置。连接yearweek的另一种方法是在(year,week)上创建复合索引。您可能也会受益于对更多搜索词的复合索引,但如果没有架构(不清楚哪个表包含哪个列),您就无法猜测。@bobince,实际上,我有一个全年和每周的复合索引,这是我的大_表的两个字段。@michael-j-v,我用架构和解释更新了它;)索引中有
年之前的
,这通常不是您想要的。很难说模式中的名称,但解释和查询不占用时间!好的,我做了修改和测试。使用您建议的复合索引,我得到的平均值为:2.1074,稍微好一点,但仍然很慢。它很慢,因为您的innodb_buffer_pool_sizei是1兆字节。您的整个InnoDB配置都使用默认设置。对@Naikon,请参见此处的关于@Michael的建议:,其中指出:“在专用数据库服务器上,您可以将其设置为机器物理内存大小的80%。”您的8MB可能太低了。MySQL的默认设置(不幸的是)通常适用于MyISAM而不适用于InnoDB。设置:我遵循您的聚集索引建议,得到了相当不同的执行时间。非常感谢。
SELECT SQL_NO_CACHE int_field, varchar_field 
FROM big_table 
INNER JOIN medium_table ON ( ... ) 
INNER JOIN small_table  ON ( ... ) 
WHERE  week BETWEEN #number AND #number 
AND year BETWEEN #number AND #number 
AND small_table.pk = 248
AND medium_table.indexed_field = #number