1 监控
1.1 profile
set profiling = 1;
show profiles;
1.2 performance schema
表performance_schema
1.3
show processlist
2 执行计划
explain
Extra
3 调优
3.1 数据类型优化
char 固定长度(最大255)
varchar(更新慢)查询、更改效率更高 空间换时间
int tinyint
内置函数可以把IP地址转换为整数
INET_ATON("192.168.0.111")
尽量避免null
datetime 8字节 精确到毫秒
timestamp 4个字节 精确到秒 时区 也就是用int类型存储的秒值,所以计算一下(32位,有符号数-2147483648~+2147483647),换算一下是2038年
date 3字节
枚举类型
范式 反范式
字符集utf8 utf8mb4
MyISAM 适合select多的场景
3.2 索引优化
回表 普通索引 -> 主键索引
覆盖索引 使用普通索引查找主键值 / SQL只需要通过索引就可以返回查询所需要的数据
最左匹配
索引合并?? 页分裂? 页合并?
索引下推 5.6之后 使用索引先筛选一遍数据,减少回表的数据量 提升性能
组合索引
聚集索引(一种数据存储方式) 如果索引不连续或更改,容易导致页分裂或页合并,影响效率
字符串前缀索引
order by最好是索引
3.3 执行过程优化
3.3.1 预发解析器和预处理
AST 抽象语法树
3.3.2 查询优化器
重新定义关联表顺序
关联查询 join_buffer_size
排序优化
随机IO、顺序IO
单次传输排序、两次传输排序 取决于max_length_for_sort_data
3.4 特定类型优化
count(1)
子查询 -> 尽量使用关联查询替换 (IO多)
优化limit分页 inner join on
union all / union / -> 行转列
4 服务器参数配置
general
datadir
socket
pid_file
port
default_storage_engin=innoDB
skip-grant-tables
charactor
charactor_set_results
charactor_set_server
charactor_set_database
connection
max_connections
max_user_connections
back_log 暂存的连接数量
wait_timeout(jdbc连接)
interactive_timeout(客户端 交互式连接)
log
慢查询
slow_query_log
slow_query_log_file
long_query_time
查询日志
general_log
general_log_file
查询缓存query cache
query_cache_size 1M
query_chche_limit 单次最大 1M
query_cache_min_res_unit 缓存块大小 4k
query_cache_type 缓存类型 0/禁用 1/缓存所有(sql_no_cache) 2/只缓存select中sql_cache
sort_buffer_size 1M
max_allowed_packet 32M 限制server接受的数据包大小
join_buffer_size 2M 关联查询缓存
innodb
innodb_file_per_table 为每张表分配一个新的文件
innodb_buffer_pool_size 缓冲池大小,缓存数据、索引等,一般配置为物理内存的80%
innodb_thread_concurrency innodb线程数 0不限制
read_buffer_size 读入缓冲区大小,对表进行顺序扫描分配一个读入缓冲区
read_rnd_buffer_size 随机读缓冲区大小
innodb_flush_log_at_trx_commit
0 - log buffer每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行。该模式下在事务提交的时候,不会主动触发写入磁盘的操作(该模式速度最快,但不太安全,mysqld进程的崩溃会导致上一秒钟所有事务数据的丢失)
1 - 每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush到磁盘,该模式为系统默认(该模式是最安全的, 但也是最慢的一种方式。在mysqld 服务崩溃或者服务器主机crash的情况下,binary log 只有可能丢失最多一个语句或者一个事务)
2 - 每次事务提交时MySQL都会把log buffer的数据写入log file,每秒执行一次 flush到磁盘操作(该模式速度较快,也比0安全,只有在操作系统崩溃或者系统断电的情况下,上一秒钟所有事务数据才可能丢失)
5 分区表
(待补充)