SET max_length_for_sort_data = 16;全字段排序,字段大小,导致RowId 排序
问题6:select * from t where city in (“杭州”," 苏州 ") order by name limit 100; 这个 SQL 语句是否需要排序?有什么方案可以避免排序?答案是:拆成两条SQl语句
问题7:关于查询mysql返回数据,应该使用store_result将结果保存在本地内存,从而来提高吞吐量,提升性能
一.:有关bufferpool的优化
(1)线上生产环境得buffer_pool_size默认是128M,实在是太小了
(2)增加innodb_bufferpool_instance数量提高并发能力
(2)innodb_ahead_read_threashold参数,尽量调大,连续加载多个数据页,会将下一个数据页也缓存进去,但是很少使用
(3)innodb_old_block_pct=37%,这个是默认值,冷热备份得比例。。innodb_old_blocks_time,就是过多长时间再次访问,就算他是再度访问
(4)设置多个bufferpool来优化并发的性能
(5)关于changeBuffer
将普通索引改为了唯一索引,导致命中率下降,原因就是没用到changeBuffer,changeBuffer适用于更新多而读比较少的场景。。读会触发changeBuffer马上进行merge操作,而这个操作是很浪费时间的
(6)刷盘,性能优化,flush刷盘策略,innodb_io_capacity参数的能力,设置为IOPS,直接用FIO这个工具来压测。提高写的能力
(7)innodb_flush_log_at _trx_commit的设置值为0,1....fsync_binlog的值为0,1,N。
二.有关索引的优化
1.查看慢查询日志——》explain分析执行计划,有没用到索引——》开启trace观察分析过程。set session opti mizer_trace="enable-on"..select * from information_schemal.Optimizer_trace;查看优化器的执行路径(1.执行准备 。2.SQL优化 3.预估执行全表扫描和索引的执行成本)
2.优化原则:
单个索引,(1)少用唯一索引。(2)哪些情况放弃使用索引,=,null, in, 函数,%开头的
联合索引:(1)使用覆盖索引 (2)左前缀匹配
其他操作:
orderBy, groupBy尽量让索引字段去排序,如果不能应该尽量加大sorted_buffer的大小。在客户端排序
join,有的时候需要拆分。让小表驱动大表,被驱动表用上索引。如果实在无法用到索引,应该加大join_buffer的大小,让其在内存中完成。
一个很长的sql,在sql语句里面做了过滤条件,数据量一大,查询很慢,且无法用到索引..
解决办法:分拆成三次查询,每次查询用到了sql,再将三次查询结果去重复,速度明显提升问题2:
问题9:如何防止删库跑路
事前:
(1)合理分配好操作权限
(2)对增删改加一个sql_safe_update=on
(3)制定操作规范,一个表不要了,该表名,而不是删除,另外可以做假删除
(4)利用备库演练,做定期备份。并且调大主库和备库延迟时间
事情发生后
(1)delete(DDl)语句,用flashBack闪回
(2)truncate或者drop命令。调小全量备份时间,两天一备份,其余用binlog恢复,找到那个点,mysqlBinlog event in 文件名。用mysqlBinlog 文件名 ----startPositin 50 --stopPosition 100 | mysql -h -P -u -p..
为增大导入速度,可以从备库连接一个日志,从那里读取日志。
问题10:临时表
tmp_table_size 这个配置限制了内存临时表的大小,默认值是 16M.
不要让临时表排序的都应该加一句order bu null,禁止表排序
问题10:磁盘随机读的两个有关参数:
IOPS和响应延迟