一条SQL查询语句是如何执行的
连接器(管理连接,权限验证)—>查询缓存—>分析器(语法分析)—>优化器(选择索引)—>执行期(返回结果)!!!
强制索引
select * from table_name force index(idx_xxx) where ......
count(*)这么慢,我该怎么办?
- 用缓存系统保存计数
- 在数据库保存计数
为什么表数据删掉一半,表文件大小不变?
将innodb_file_per_table设置为ON
建议
插入数据
insert …select 这种批量插入数据的场景时,从并发插入数据性 能的角度考虑,我建议你这样设置:innodb_autoinc_lock_mode=2 ,并且 binlog_format=row .这样做,既能提升并发性,又不会出现数据一致性问题
io性能
show variables like '%innodb_io_capacity%';
innodb_io_capacity的默认值为200,所以如果主机磁盘用的是SSD,大家建议改为20000.
就建议你把innodb_flush_neighbors的值设置成0,减少SQL语句响应时间
show variables like '%innodb_buffer_pool_size%';
InnoDB Buffer Pool的大小是由参数 innodb_buffer_pool_size确定的,一般建议设置成可用物理 内存的60%~80%
因此,在出现IO瓶颈的场景里
- binlog_group_commit_sync_delay参数,表示延迟多少微秒后才调用fsync
- binlog_group_commit_sync_no_delay_count参数,表示累积多少次以后才调用fsync
针对这个问题,可以考虑以下三种方法: - 设置 binlog_group_commit_sync_delay和 binlog_group_commit_sync_no_delay_count参数,
减少binlog的写盘次数 - 将sync_binlog 设置为大于1的值(比较常见是100~1000)。这样做的风险是,主机掉电时会丢binlog日志
- 将innodb_flush_log_at_trx_commit设置为2。这样做的风险是,主机掉电的时候会丢数据
我不建议你把innodb_flush_log_at_trx_commit 设置成0
并发数
建议把innodb_thread_concurrency设置为64~128 之间
如何避免长事务对业务的影响?
把innodb_undo_tablespaces设置成2(或更大的值)!!!
死锁
建议:如果你的事务中需要锁多个行,要把最可能造成锁冲突、最可能影响并 发度的锁的申请时机尽量往后放
先处理掉那些占着连接但是不工作的线程
show processlist;
kill掉sleep的连接
kill connection 8;
|