查询优化:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
1 索引index
where, order by ,group by
添加在值很少重复 ,查询字段中经常用到
存储引擎:
innodb --cluster聚簇索引
memory----hash索引
myisam----B-tree 或Fulltext
索引是否有用 show status like 'Handler'
显示中Handler_read_rnd_next 值高的话说明索引设计的不好
Handler_read_key 值越高说明索引设计的越好
表优化和检查 ANALYZE TABLE stu;
查询分析:explain 适用于复杂的查询语句
explain select * from stu 可以分析出该语句的信息 是否用到索引,查询类型等
显示中type 显示 ALL 最差的查询 const 最精确的查询 index 用的索引
rows 返回多少行
使用索引加速查询:
show index from stu;显示stu表的索引
ALTER TABLES stu ADD INDEX mycourse(course); 添加索引
连接和子查询:
原则: 1、能用连接最好不用子查询
2、使用会话变量即临时表来替代子查询(临时表 内存表)
select name from stu where age > (select AVG(age) from stu)
select @avg:AVG(age) from stu
explain select name from stu where age >@avg
3、临时表不能大于系统限定的临时表 ,当大于时会将临时表的结果保存至外存中 会拖慢查询速度
show global variables like %heap% 设置其大小
4、显式使用字段,避免使用通配符*
5、尽可能对连接的字段使用索引
查询缓存:
show variables like '%query_cache%';
query_cache_limit 1048576 返回结果查过1M就不给其进行缓存 单位字节
query_cache_size 1048576 内存中使用缓存的大小
SET GLOBAL query_cache_size=10*1024*1024 设置内存中缓存使用大小10M
query_cache_type ON ---> 1使用缓存 0 不使用缓存 2 按需缓存 ON 符合缓存条件的语句都给其缓存
查询语句要风格一致 要么都大写要么都小写 不一致会导致缓存设置形同虚设
开机自动开启缓存 vim /etc/my.cnf 将设置添加到[mysqld]
对事务进行优化:
1、尽可能使用小事务 KISS (Keep It Simple,Stupid)
2、选择适合的隔离级别,隔离级别越高性能越低 但是数据安全就越高
show variables like '%tx%'; 查看事务级别
3、尽可能避免死锁: 级别越低死锁的可能性就越低
对存储例程优化: 能不用尽可能不用存储例程
1、代码尽可能简短,遵循KISS法则
2、优化存储例程中的每一个SQL语句;
总结:
事先的优化设计比事后的优化要好的多
对表设计进行优化
服务器级别的优化:
table_open_cache :对表名缓存优化 mysql中打开的表在内存中表数目的优化
show global variables like '%cache%'
table_open_cache
show global variables like '%key%'
key_buffer_size 数值尽可能的大
read_buffer_size 读缓存大小
thread_cache_size 线程缓存大小 数值要大些
binlog_cache_size
sort_buffer_siza 排序的buffer大小
show global variables like '%innodb%'
innodb_thread_concurrency 一般为cpu个数*2
mysql的性能测试工具:
1、组件mysql自身测试工具的sql-bench
/usr/local/mysql/sql-bench下 是一些perl脚本
要安装 perl perl-DBI perl-DBD-MySQL才能运行
2、mysqlslap
3、super smark
4.sysbench
转载于:https://blog.51cto.com/jingmu/514286