MySQL InnoDB查询性能

| 我正在尝试优化一个简单的sql查询,该查询将多次运行大量数据。 这是方案: MySQL与InnoDB表 在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
一些测试结果: 平均查询时间:2,3374s 测试表包含真实表的数据的第十部分(甚至更少),例如big_test_table的75.000行。 查询返回(在测试用例中)6500行。 Navicat表示,查询时间的99.95%用于“发送数据” 我尝试使用MyISAM,平均查询时间为:2,1898s 如何改善查询或数据库方案? 最好将我的年/周字段和[yearweek]索引字段连接起来? 在一些基准测试中,我看到MyISAM比Innodb快,但似乎我有一点改进:
http://www.mysqlperformanceblog.com/files/benchmarks/innodb-myisam-falcon.html
http://www.jortk.nl/2008/12/mysql-performance-benchmark-myisam-versus-innodb/
丢掉FK值得去MyISAM吗? 谢谢! 更新: 解释选择:
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
根据ypercube提出的索引,目前,这是最快的查询(平均2107秒):
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
    
已邀请:
        希望您找到感兴趣的以下链接和以前的答案。 我希望能为您提供一个具体的问题答案,但我没有时间完全了解您的方案:命名约定太糟糕,缺少有用的信息,不一致等,等等。 但是,您应该在下面找到解决问题的方法,并且与性能较低的myisam引擎无关! 以下答案之一的摘录:   您应该阅读以下内容,并了解一些设计合理的innodb表的优点以及如何最好地使用聚簇索引-只有innodb才有! 聚集索引: http://dev.mysql.com/doc/refman/5.0/en/innodb-index-types.html http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/ 我以前的答案: 6000万个条目,请从特定月份选择条目。如何优化数据库? MySQL和NoSQL:帮助我选择合适的一个 如何避免多对多查询中的“使用临时”? 传递大量数据的查询的最佳MySQL设置? 希望这可以帮助 :)     
        (编辑)
big_table
中的
(year, week)
(week, year)
索引肯定会帮助此查询。 我看到你已经有了第二个,
(week, year)
。我更喜欢第一个,但对于此查询,它并没有太大的区别,如果有的话。 我会补充:
big_table
中的复合索引
(code_of_medium_table, year, week)
medium_table.
中的复合索引
(code_of_small_table, indexed_field)
您可以尝试重新发布查询计划吗? 或
(year, week, code_of_medium_table)
(indexed_field, code_of_small_table)
。     

要回复问题请先登录注册