mysql.进阶01
01.查询mysql支持的存储引擎
> 创建表时进行配置
> InnoDB 引擎
> 逻辑结构
02.索引
> 索引结构
>> 二叉树缺点:
顺序插入时,会形成一个链表,查询性能大大降低。大数据量情况下,层级较深,检索速度慢;
>> 红黑树: 大数据量情况下,层级较深,检索速度慢;
>> 多路平衡查找树
>> 数据结构可视化网站:http://www.rmboot.com/
>> B+ Tree
* 所有数据都会出现在叶子节点上;
* 叶子节点形成一个单向链表;
> 索引分类
> 聚集索引选取规则
a. 如果存在主键,主键索引就是聚集索引;
b. 如果不存在主键,将使用第一个唯一(unique)索引作为聚集索引;
c. 如果表没有主键,也没有配置唯一索引,系统将自动构建一个 rowid 做为隐藏的聚集索引;
> 聚集索引与二级索引存储内容的区别
> 创建索引:create [ unique | fulltext ] index 索引名称 on 表名 (字段1,....)
> 查看索引:show index from 表名;
> 删除索引: drop index 索引名 on 表名;
03. SQL执行频率
mysql连接成功后,可以通过 show [session | global ] status 命令,获取服务器状态;
通过命令可以获取当前数据库的 insert , update , delete , seelct 的访问频次;
>> 慢查询日志
慢查询日志,记录了所有执行时间超过指定参数(long_query_time, 单位:秒,默认10秒)的所有SQL语句的日志;
mysql的慢查询日志默认没有开启,需要在mysql的配置文件 (/etc/my.cnf)夹中配置:
> 查询数据库的慢查询状态: show variables like 'slow_query_log';
> 开启方式
日志位置: /var/lib/mysql/localhost-slow.log
>> profile 详情
show profiles 能够在做SQL优化时帮助我们了解时间都耗费到哪里去了,
通过 have_profiling 参数,能够看到当前mysql是否支持 profile 操作;
> select @@have_profiling
> 默认 profiling 是关闭的;通过 set 语句 在 session/global 级别开启 profiling;
set profiling =1;
> 在开启 profiling 参数后,通过 show profiles 查看每一条SQL的耗时情况;
>> explain执行计划
explain 或者 des 命令获取 mysql 如何执行 select 语句的信息,包括在 select 语句执行过程中表如何连接和连接的顺序;
语法:
04.索引的使用
>> 最左前缀法则: 如果索引了多列(联合索引),要遵守最左前缀法则;指的是查询从索引的最左列开始,并且不跳过索引中的列;
如果跳开了某一列,索引将部分失败 (后面的字段索引失效);
(与查询条件中,索引列放的位置是没关系的, 只要条件中存在索引相应的字段,即可)
>> 范围查询: 联合索引中,出现范围查询 (>, < 等范围判断),范围查询右侧的列索引失效;
>> 索引列运算:不要在索引列上做运算,否则索引失败;
>>字符串不加引用:字符串类型字段使用时,不加引号;索引将失效;
>>模糊查询: 如果仅仅是尾部模糊匹配,索引不会失效,如果是头部模糊匹配,索引失效;
>> or 连接条件:用 or 分开的条件,如果 or 前的条件中的列有索引,而后面的列没有索引,那么涉及到的索引都不会被用到;
>> 数据分布影响:如果 mysql 评估使用索引比全表更慢,则不会使用索引;
>> SQL提示,当列参与多个索引时,mysql会自动分析使用某个索引,在sql语句中,可以加入一些人为的提示来达到SQL语句的优化;
>> 覆盖索引: 尽量使用覆盖索引 (查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到), 减少 select * 的使用;
>> 前缀索引:为字段的前N个字节做索引
create index idx_xxx on table_name(column(字节数));
05.索引的设计原则
06.视图
07.存储过程
> Create Procedure 存储过程名称([参数列表])
begin
SQL语句;
end;
> 调用: Call 存储过程名称([参数])
> 查看
a. select * from Information_schema.routines where routine_schema='xxx'
b. show create procedure 存储过程名称
> 删除
drop procedure [if exists] 存储过程名称
> 关于命令行中对存储过程的创建处理
默认情况下,命令行中是识别 ; 做为结束符,这样无法完整的执行存储过程语句;
可以通过 delimiter 来自定义结束符,如: delimiter $$, 只有检测到 $$ 时才认为是结束符;
> 系统变量
如果没有指定 Session / Global ,默认是 Session;
mysql 服务器重启之后,所设置的全局参数会失效;若想不失效,可以在 /etc/my.conf 中进行配置;
> 自定义变量
自定义变量无需进行声明和初始话,若直接调用,取值为 null 而已;
> 局部变量
> if 语法
> 参数
> Case
> 循环
> 游标
> 条件处理
> 存储函数
> 触发器
08. 锁
> 全局锁
>> 设置全局锁 : flush tables with read lock;
>> 数据库备份: mysqldump -u账号 -p密码 数据库名 > 存储文件
>> 解锁 : unlock tables;
>> 全局锁的特点
>> 表级锁
表级锁分为:表锁,元数据锁(MDL),意向锁;
元数据锁:
意向锁
意向共享锁(IS):由语句 select .. lock in share model 添加;
> 与表锁共享锁(read)兼容,与表锁排他锁(write)互斥;
意向排他锁(IX) : 由 insert , update, delete, select ... for update 添加;
>与表锁共享锁(read)及排它锁(write)都互斥,意向锁之间不会互斥;
** 通过如下SQL查看意向锁及行锁的加锁情况
> select object)schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;
>>行级锁