mysql高级

mysql分为四层:1.连接层 2.服务层 3.引擎层 4.存储层
在这里插入图片描述
7中join的sql编写:
左连接:

select <select_list> from TableA A left join TableB B on A.id=B.id;

右连接:

select <select_list> from TableA A right join TableB B on A.id=B.id;

内连接:

select <select_list> from TableA A left join TableB B on A.id=B.id;

左外连接

select <select_list> from TableA A left join TableB B on  A.id=B.id where B.id is null;

右外连接

select <select_list> from TableA A right join TableB B on A.id=B.id where A.id is null;

全连接

select <select_list> from TableA A left join TableB B on A.id=B.id
->union
->select <select_list> from TableA A right join TableB B on A.id=B.id

全连接不要相同的一列

select <select_list> from TableA A left join TableB B on A.id=B.id where B.id is null
->union
->select <select_list> from TableA A right join TableB B on A.id=B.id where A.id is null;

MySQL索引:
定义:帮助mysql高效获取数据的数据结构
目的:提高查找效率,类似于字典

索引分类:
1.单值索引:即一个索引只包含单个列,一个表可以有多个单列索引
2.唯一索引:索引列的值必须唯一,但允许有空值
3.复合索引:即一个索引包含多个列
基本语法:

创建:1.create [union] index  indexName on mytable(columnName(length));
	2.alter mytable add [union] index [indexName] on (columnName(length));
删除:DROP INDEX [indexName]  on mytable;
查看:show index from table_name

有四种方式来添加数据表的索引:

ALTER TABLE table_name ADD primary key (column_list); 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为null
ALTER TABLE table_name ADD union indexName(column_list);这条语句创建索引的值必须是唯一的(除了null外,null可能出现多次)
ALTER TABLE table_name ADD indexName(column_list);普通的索引,索引值可出现多次
ALTER TABLE table_name ADD FULLTEXT indexName(column_list);

使用explain关键字可以模拟优化器执行sql查询语句,从而知道mysql是如何处理你的sql语句的。分析你的查询语句表结构的性能瓶颈。
explain+sql语句
在这里插入图片描述在这里插入图片描述
id:selecet查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序
select_type:查询的类型,主要用于区别普通查询,联合查询,子查询等的复杂查询
有哪些:

simple:最简单的select查询,查询中不包括子查询或者union
primary:查询中若包含任何复杂的子部分,最外层查询则被标记为
subquery:在select或者where中包含了子查询
derived:在form列表中包含的子查询被标记为derived(衍生),mysql会递归执行这些子查询,把结果放在临时表里
union:若第二个select出现在union之后,则标记为union,若union包含在form子句的子查询中,外层select则会被标记为derived
union result:从union表获取结果的select

type:

类型:all,index,range,ref,eq_ref,const,system,null
从最好到最差:
system>const>eq_ref>ref>range>index>all
eq_ref:唯一性索引扫描,对于每个索引建,表中只有一条记录与之匹配,常见于主键或唯一索引扫描
ref:非唯一性索引扫描,返回匹配某个单独值的的所有行,本质上也是一种索引访问,它返回所有所有匹配单独值的行,然而,它可能会找到符合多个条件的行,所以它应该属于查找和扫描的混合体

possible_keys:显示可能应用在这张表的索引,一个或多个。查询涉及到的字段上若存在索引,则将该索引列出,但不一定被查询实际所使用
key:实际使用的索引。如果为null,则没有使用索引。查询中若使用了覆盖索引,则噶索引仅出现在key列表中。
ref:显示索引的哪一列被使用了,如果可能的话,是一个常数
rows:根据表统计信息极简索引选用情况,大致估算出找到所需的记录需要的行数
extra:包含不适合在其他列中显示单十分重要的额外信息

Using filesort:说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。mysql中无法利用索引完成的排序操作称为“文件排序”
Using Temporary:使用了临时表保存中间结果,mysql在对查询结果排序时使用了临时表。常见于排序查询order by和分组查询group by。
USING index:表示相应的select操作中使用了覆盖索引,避免了访问标的数据行,效率不错。
						如果同时出现using where,表明索引被用来执行索引键值的查找。如果没有出现using where,则表示索引用来读取数据而非进行查找动作。

索引优化
单表:建立索引时,有出现>,<符号的情况,尽量不要在该列建立索引,而是按照顺序,在其他列建立索引
如果是两张表,左连接在右表建索引,右连接在左表建索引
最佳左前缀法则:如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不会跳过索引中的列。
索引失败案例:在这里插入图片描述
在这里插入图片描述
查询截取分析:
优化原则:小表驱动大表,即小的数据集驱动大的数据集
在这里插入图片描述
exists:将主查询的数据,放到子查询中做条件验证,根据验证结果(true或false)来决定主查询的数据结果是否得以保留。
在这里插入图片描述
慢查询日志:
show variables like ‘%slow_query_log%’;查看慢查询日志
set global slow_query_log=1;开启慢查询日志
set global long_query_time=3;修改阙值到3秒钟就是慢sql
show global status like ‘%slow_queries%’;
mysqldumpslow工具的常用:mysqldumpslow --help
在这里插入图片描述
创建函数,如果出现the function has none of deterministic…
show variables like ‘%log_bin_trust_function_creators%’;
set log_bin_trust_function_creators=1;

show profile:
show variables like ‘profiling’;
set profiling=on;
show profiles;查看结果
诊断sql:show profile cpu,block io for query 前面有问题的sql语句编号;
在这里插入图片描述
全局查询日志:
set global general_log=1;
set global log_output=‘table’;
select * from mysql.general_log;

mysql锁机制
lock table 表名字 read(write),表名字2 read(write),其他;手动添加表锁
show open tables;查看表
unlock tables;释放表锁
简而言之,就是读锁会阻塞写,但是不会堵塞读,而写锁则都会堵塞。
可以通过检查table_locks_waited和table_locks_immediate状态变量来分析系统上的表锁定
sql:show status like ‘table%’;
Table_ locks_ immediate: 产生表级锁定的次数,表示可以立即获取锁的查询次数,每立即获取锁值加1 ;
Table_locks__waited:出现表级锁定争用而发生等待的次数(不能立即获取锁的次数,每等待-次锁值加1),此值高则说明存在着较严重的表锁争用情况。
在这里插入图片描述
如何锁定一行:
在这里插入图片描述
show status like ‘innodb_row_lock%’;

Innodb_ _row_ lock_ current_ waits: 当前正在等待锁定的数量; 
Innodb_ row_ _lock_ _timne: 从系统启动到现在锁定总时间长度;
Innodb_ _row_ lock_ _time_ _avg: 每次等待所花平均时间;
Innodb_ _row_ _lock_ _time_ max: 从系统启动到现在等待最常的一次所花的时间;
Innodb_ _row_ lock_ _waits: 系统启动后到现在总共等待的次数; 

mysql主从复制
主机修改my.ini配置-----------------------------------------------丛机配置my.cnf文件

1.主服务器唯一id                                                   1.丛服务器唯一id
server-id=1                                                            2.启用二进制日志
2.启用二进制日志
log-bin=自己本地的路径/mysqlbin
3.启用错误日志
log-err=自己本地的路径/mysqlerr
4.根目录
basedir="自己本地路径"
5.临时目录
tempdir=“自己本地路径”
6.数据目录
datadir="自己本地路径/data/"
7.read-only=0,主机读写都可以
8.设置不要复制的数据库
binlog-ignore-db=mysql
9.设置需要复制的数据库
binlog-do-db=需要复制的主数据库名字

主机操作:

grant replication slave on *.* to '张三'@'从数据库ip' identified by '密码';
flush privileges;刷新数据库
show master status;  记录显示的数字,作为从机复制的起点

从机操作

change master to master_host='主机ip' master_user='张三' master_password='root' ,
master_log_file='mysqlbin.具体数字',master_log_pos=具体值;
start slave;启动从机复制功能
show slave status\G  如果显示slave_io_running和slave_sql_running都是yes,则表示配置成功
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值