MySQL InnoDB查询性能

如何解决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)
。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-