mysql配置,修改字符集编码是用于当我们创建数据库时,没有指定数据字符集编码类型时,就会用配置默认的字符集编码,因此我们最好修改了默认字符集编码为utf8,当然更重要的就是在创建数据库和表时一定要指定好utf8字符集编码,utf8mb4这种。
#vim 编辑文件时 #在当前光标的下一行输入用:按o,就会跳到下一行,插入状态 #log-bin 二进制日志,用于主从复制 #log-error 错误日志,默认是关闭的。记录严重的警告和错误信息,每次启动和关闭的详细信息等。 #查看mysql支持的存储引擎 show engines; #查看mysql当前默认的存储引擎 show VARIABLES like '%storage_engine%';
分层的好处就是分层隔离后,哪一层出了问题就找谁,方便定位查找。
Optimizer(优化器)是mysql的优化器。阿里取消了Optimizer优化器来提高执行性能,因为其sql已经表示写得最优了,不需要再经过一层优化器来耗时。
mysql架构:分层可拔插。分为4层:
MyISAM适合读多的场景,InnoDB适合写多特别是需要事务支持的场景。
SQL执行时间慢的原因(慢查询):
索引是Mysql高效获取数据的数据结构,也就是说索引本质是数据结构,是排好序的快速查找数据结构,底层是B+树(多路搜索树)。
索引会影响作用于where条件的查找和order by 的排序。
update更新慢的原因是除了数据在改变,索引也在改变重新建立索引。
索引本身也很大,不可能全部在内存中,一般会以索引文件的形式存储在磁盘中,在用到的时候再加载到内存。
优势:
劣势:
-- 语句 EXPLAIN SELECT * FROM city c where c.CountryCode='NLD' ;
表示当前查询的是哪张表或者临时表。
-- index 全索引扫描,虽然是读全表,但是因为字段id是从索引中读取的,所以比读全表要好。 select id from user;
读取的行数越少越好。
using filesort
表示没有使用到索引进行排序,通常出现在排序的字段不是索引字段,需要优化。
using temporary
表示使用了临时表保存中间结果,mysql在排序时使用了临时表,特别需要优化。
using index
使用了索引覆盖,是好的。
针对下面的查询sql在没有建立索引时的执行计划。
加索引优化,但是查询执行效率只有range级别,这是因为索引在遇到范围查找如>
大于、小于等时会导致索引实现,只用到了复合索引的第一个字段category_id
,且排序也用不到索引,是using filesort
表示没有使用到索引进行排序,需要继续优化。
继续优化,正确的索引建立
因为范围查找导致索引失效的问题,我们应该只建立两个用到索引的字段,对于范围查找的字段就不建立索引了,否则索引会失效。
针对下面的左联查询sql在没有建立索引时的执行计划。
对左联查询的右表加索引优化
可以看到右表查询优化到了ref,查询rows也优化了。
对左联查询的左表加索引优化
可以看到左表查询只优化到index,查询rows数没有减少。
结论:左联查询要对右表加索引,右联则要对左表加索引。
针对下面的三表左联查询sql在没有建立索引时的执行计划
优化:参考双表左联查询的结论,要在右表上加索引。
结论:与双表左联查询类似,要在右表上加索引,且查询的时候左表必须是小表,用小表驱动大表。
索引判断题
默认不开启,只有在有问题的时候才使用命令开启慢查询日志。
-- 查看是否开启慢查询 SHOW VARIABLES LIKE '%slow_query_log%'; -- 开启和关闭慢查询 注意在mysql重启后会失效,如果要永久生效则要配置在my.cnf上 SET GLOBAL slow_query_log =1; SET GLOBAL slow_query_log =0; -- 查询,默认10s SHOW VARIABLES LIKE '%long_query_time%'; -- 设置慢查询阈值 SET GLOBAL long_query_time =3; -- 通过加global查询是否设置生效 SHOW GLOBAL VARIABLES LIKE '%long_query_time%'; -- 查询当前系统中有几条慢sql记录 SHOW GLOBAL STATUS LIKE '%Slow_queries%';
配置如下:
慢查询日志linux文件路径
注意需要新开会话或者加global才能看到生效值
#查看命令帮助 mysqldumpslow --help
show profile查询使用参数
show profile要注意的资源消耗点
-- 查看show profile 是否打开 ,有的版本是默认开启,有的是默认关闭,开启和关闭不生效 SHOW VARIABLES LIKE '%profiling%'; -- 通过加global查询show profile是否设置生效 SHOW GLOBAL VARIABLES LIKE '%profiling%'; -- 开启和关闭profiling SET profiling ='on'; SET profiling ='off'; -- 查询最近15条sql的明细id show PROFILES; -- 根据查询id查看查询的资源消耗明细 show PROFILE cpu,block io for QUERY 247; -- 查看所有的开销信息 show PROFILE all for QUERY 247;
永远不要在生产上开启该功能。
-- 开启全局日志 set GLOBAL general_log=1; SET GLOBAL log_output='TABLE'; -- 查询全局日志表 SELECT * FROM mysql.general_log;
session1加了读锁时:session1可以查自己锁的表,不能新增或更新自己锁的表,也不能查询或更新别的表;
session2可以读被锁的表,但不能更新被锁的表(会被阻塞);可以读和更新其他表。
session1加了写锁时:session1可以查自己锁的表,可以新增或更新自己锁的表;不能查询或更新别的表;
session2可以读被锁的表会被阻塞,也不能更新被锁的表;可以读和更新其他表。
查询条件类型使用不当导致的索引失效变表锁的情况,所以在使用更新/查询时一定要注意查询条件与字段类型相匹配。
mysql会通过间隙锁来锁定一个范围,保证不出现幻读的情况。但是会阻塞住该范围内的插入操作。
被for unpdate
锁定的行在其他操作过来是会被阻塞,属于悲观锁。
-- 行锁情况分析 SHOW STATUS LIKE '%innodb_row_lock%';
注意:函数有返回值,存储过程没有返回值,只有输出值。
MySQL数据库高级