MySQL笔记08-MySQL优化
【SQL语句优化10个原则】
【索引与性能分析】
show profiles 命令可以用来查看本次启动MySQL客户端执行过的SQL语句的执行时间:
但是前提需要先执行 set @@profiling=1;
从下面的结果可以看出,两条相同的SQL语句,后面的比前面快,因为MySQL缓存了查询。
若要查看某一条Query的查询详情,使用 show profile for query N:
◆ MySQL执行计划:Explain
explain select * from qg_score_bmd order by id limit 10,30;
◆ MySQL索引建立和使用的基本原则:
【服务器和配置的优化】
SHOW GLOBAL STATUS 可以得到系统当前状态,如下所示(表格数据不完整,太长,只显示部分):
◆ 选择存储引擎的基本原则:
◆ MySQL服务器调整优化的措施:
【MySQL瓶颈及应对措施】—— 针对千万级别数据量
【数据库设计】
【1-范式与反范式】
◆ 通常在设计数据库时需要遵守如下原则:
【2-数据库分区】
SHOW VARIABLES LIKE '%partition%'
(很遗憾,本机测试执行此命令,没有返回任何数据,估计是不支持吧...)
◆ 分区的创建
◆ 使用分区的一些限制
【3-分表的应用】
【1-MySQL自增长序列】
1.MySQL通过 auto_increment 自增长字段;
2.MySQL自增长“序列” 和 序列 是两回事;
3.修改系统变量 auto_increment_increment 设置步长,这事一个全局设置。
4.推荐使用序列,因为有更高的定制性和可控性。
5.在Log表和无意义字段中仍然推荐使用自增。
6.不要再一个表的字段上同时使用自增和“序列”。
后面的具体的操作序列的案例,参考PDF。
【2-MySQL视图】
◆ 创建视图的注意事项
【3-MySQL存储过程和事件调度】
◆ 补充 —— PHP中防止Apache或者Nginx中断的代码:
ignore_user_abort(true);
set_time_limit(0);
[代码]存储过程和定时器:定时删除处理过的日志
[代码] 创建事件 CREATE EVENT
【4-用MySQL模拟消息队列】
【5-SQL注入漏洞与防范】
◆ 一个简单的SQL注入登录(牛逼啊!):
◆ 利用注入获取另外一个表的数据(看PDF)
◆ 如何防范SQL注入
-
show status 主要查看以下信息:
2.使用 mysqladmin -uroot -p123456 ext 不登陆mysql也可以查看此信息。
Queries 当前已经发生了多少次查询。
Threads_connected 有几个线程来连接了。
Threads_running 有几个进程正在工作。
【Awk脚本】
Awk是一个简便的直译式的文本处理工具.擅长处理--多行多列的数据。
【处理过程】:
While(还有下一行) {
1:读取下一行,并把下一行赋给$0,各列赋给$1,$2...$N变量
2: 用指定的命令来处理该行
}
* 如何处理1行数据?
答: 分2部分, pattern (条件) + action(处理动作)
* 1个简单awk脚本
awk ‘{printf “%s\n” , $1}’ xx.txt // 把xx.txt的每一行进行输出
* 统计mysql服务器信息
mysqladmin -uroot ext|awk 'Queries/{q=$4}/Threads_connected/{c=$4}/Threads_running/{r=$4}END{printf("%d %d %d\n",q,c,r)}'
vim score.txt
awk '{printf("%s\n"),$0}' score.txt 打印:
打印 字母l 开头的数据 —— lisi 和 lucy
awk '/l/{printf("%s\n"),$0}' score.txt
mysqladmin -uroot -p123456 ext | awk '/Queries/{printf("%d",$4)}'
为啥是$4,因为要取出 | Queries | 1416 | 的第4列:
《附加》 mysql -u --skip-grant-tables 就可以跳过验证账号和密码而直接登录MySQL,
而且一些命令行的输出也不会报出:Warning: Using a password on the command line interface can be insecure.
同理,也把Threads_connected 和 Threads_running 打印出来:
mysqladmin -uroot -p123456 ext | awk '/Queries/{printf("%d ",$4)}/Threads_connected/{printf("%d ",$4)}/Threads_running/{printf("%d\n",$4)}'
也可以优化一下,赋给变量,再统一打印,或写入log:
mysqladmin -uroot -p123456 ext | awk '/Queries/{q=$4}/Threads_connected/{c=$4}/Threads_running/{r=$4}END{printf("%d %d %d\n",q,c,r)}'
或者:
mysqladmin -u --skip-grant-tables ext | awk '/Queries/{q=$4}/Threads_connected/{c=$4}/Threads_running/{r=$4}END{printf("%d %d %d\n",q,c,r)}'