MySql

1. 什么是数据库

数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。mysql是关系型数据库管理系统(RDBMS)来存储和管理大数据量。所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。

2. 基本命令使用

2.1 命令进入数据库

首先进入数据库的bin目录下

mysql -u root -p root

2.2 查看数据库有哪些表

show databases;

2.3 选择某个表

use test;

2.4 创建一个数据库

CREATE DATABASE aa;

2.5 退出数据库

exit

2.6 查看表结构

desc emp;

2.7 查看使用的哪个数据库

SELECT DATABASE();

2.8 查看数据表

show tables;

2.9 查看表的DDL

show create table DEPT;

2.10 修改表名 MySQL命令

alter table student rename to stu;

2.11 增加字段 MySQL命令

alter table stu add address varchar(50);

在使用命令行时,mysql输入:才代表结束 \c 代表终止一条sql语句的终止

3. SQL简述

3.1 概述

Structure Query Language(结构化查询语言)简称SQL,它被美国国家标准局(ANSI)确定为关系型数据库语言的美国标准,后被国际化标准组织(ISO)采纳为关系数据库语言的国际标准。数据库管理系统可以通过SQL管理数据库;定义和操作数据,维护数据的完整性和安全性

3.2 SQL的分类

  • DQL:数据查询语言(凡是带有select关键字的都是查询语句)
  • DML:数据库操作语言(凡是对表当中的数据进行增删改的都是DML){insert delete update}操作数据的
  • DDL:数据库定义语言(凡是带有create,drop,alter的是DDL) 操作表的结构进行操作
  • DCL:数据控制语言(授权grant和安全级别deny)
  • TCL:数据库事务语言(commit提交 rollback回滚)

4. 数据库的三大范式

  • 第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据线;也就是说:每列的值具有原子性,不可再分割。
  • 第二范式(2NF)是在第一范式(1NF)的基础上建立起来得,满足第二范式(2NF)必须先满足第一范式(1NF)。如果表是单主键,那么主键以外的列必须完全依赖于主键;如果表是复合主键,那么主键以外的列必须完全依赖于主键,不能仅依赖主键的一部分。
  • 第三范式(3NF)是在第二范式的基础上建立起来的,即满足第三范式必须要先满足第二范式。第三范式(3NF)要求:表中的非主键列必须和主键直接相关而不能间接相关;也就是说:非主键列之间不能相关依赖。

5. 数据库的表约束

含义:一种限制,用于限制表中的数据,为了保证表中数据的准确性和可靠性。

  • NOT NULL :非空,用于保证该字段的值不能为空。例如学生表的学生姓名及学号等等。
  • DEFAULT:默认值,用于保证该字段有默认值。例如学生表的学生性别
  • PRIMARY KEY:主键,用于保证该字段的值具有唯一性并且非空。例如学生表的学生学号等。
  • UNIQUE:唯一,用于保证该字段的值具有唯一性,可以为空。例如注册用户的手机号,身份证号等。
  • CHECK:检查约束(MySql不支持),检查字段的值是否为指定的值。
  • FOREIGN KEY:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值,在从表添加外键约束,用于引用主表中某些的值。例如学生表的专业编号

6. 数据库的简单查询语句DQL

6.1 简单查询

1.查询所有字段
SELECT * FROM EMP; # * 号查询所有字段会影响效率(在查询时会把*号转为所有字段)

多取了不需要的列: 毋庸置疑,使用 * 查询时,会把所有的列都查询出来,会查找出来好多我们并不需要的列,在SQL语句复杂等情况下查询的成本就比较高,内存和CPU的消耗也比较大。
杜绝了覆盖索引的可能: 覆盖索引是效率很高很推荐的查询方式,而使用select * 就表示肯定用不到覆盖索引。
增加传输时间和网络开销: 使用select * 多查找出来的数据,会增加数据传输的时间,尤其是一些很大的类型比如log或者MD5,即使 mysql 服务器和客户端是在同一台机器上,使用的协议还是 tcp,通信也是需要额外的时间。
增加了IO次数: 如果表中存在字段是大字段例如text、varchar等,当字段超过728字节后,就会把超出的数据放到另一个地方,在查询结果读取时,就会增加IO操作
改变表结构时可能出现错误: 使用 SELECT * 需谨慎,因为一旦列的个数或顺序更改,就有可能程序执行失败

2.查询一个字段
SELECT JOB FROM EMP;
3.查询多个字段
SELECT JOB,SAL FROM EMP;  #注意多个字段需要使用逗号分隔开
4.查询语句起别名
SELECT JOB as a,SAL AS b FROM EMP; #使用as关键字起别名 只是在显示的时候使用别名。
SELECT JOB a,SAL b FROM EMP; #省略写法
SELECT JOB 'a d',SAL b FROM EMP;  #注意在起别名的时候 别名中间有空格 加单引号
5.查询语句 字段做数学运算
SELECT JOB,SAL * 12 FROM EMP;
6.常数查询
SELECT JOB,'1980-12-17' FROM EMP;

6.2 条件查询

语法:select 字段1,字段2,字段3····from 表名 where 条件

1. 等于 = 查询
SELECT * FROM EMP WHERE MGR=7902;
2. 不等于 != <>
SELECT * FROM EMP WHERE MGR != 7902
SELECT * FROM EMP WHERE MGR <> 7902
3. 小于 < 大于> 小于等于 <= 大于等于 >=
SELECT * FROM EMP WHERE MGR < 7902
SELECT * FROM EMP WHERE MGR <= 7902SELECT * FROM EMP WHERE MGR > 7902
SELECT * FROM EMP WHERE MGR >= 7902
4. between … and … 俩个范围之间 等同于 >= and <=
SELECT * from    EMP WHERE SAL BETWEEN 800 AND 1250;
SELECT * FROM EMP WHERE SAL >=800 AND SAL <=1250;
5. is null 和 null
SELECT * FROM EMP WHERE COMM IS NULL;
SELECT * FROM EMP WHERE COMM IS NOT NULL;
6. and 和 or 或者
SELECT * FROM EMP WHERE JOB = 'salesman' AND SAL = 1600;
SELECT * FROM EMP WHERE JOB = 'salesman' AND SAL = 1600 OR SAL = 1500;

注意:and 和 or 同时出现时,and的优先级高于or,在不明白情况的下,可以加小括号。

7.in 和 not in
SELECT * FROM EMP WHERE MGR IN(7698,7688);
SELECT * FROM EMP WHERE MGR not IN(7698,7688);

in指向的不是区间内容,是or的意思

8. not 是取反的意思
is null
is not null
in
not in
9. like 模糊查询
# % 匹配任意多个字符
SELECT JOB,ENAME FROM EMP WHERE ENAME LIKE '%m%'; #表示名字中间有m的
SELECT JOB,ENAME FROM EMP WHERE ENAME LIKE 's%'; #表示名字以s开头的
SELECT JOB,ENAME FROM EMP WHERE ENAME LIKE '%n'; #表示名字以s开头的# _ 代表匹配任意一个字符
SELECT JOB,ENAME FROM EMP WHERE ENAME LIKE '_m%'; #表示第二个字母为m的

6.3 排序

# desc 降序 asc 升序
SELECT * FROM EMP ORDER BY SAL ASC;
SELECT * FROM EMP ORDER BY SAL desc;
# 多个字段排序 sal起主导为止,只有sal相同的情况下,才考虑 deptno排序
SELECT * FROM EMP ORDER BY SAL ASC,DEPTNO ASC;

6.4 数据处理函数

1.转换大小写
SELECT UPPER(ENAME) FROM EMP; #转换大写
SELECT LOWER(ENAME) FROM EMP; #转换小写
2. 字符串截取 substr 字符串拼接 concat
# 第一个参数需要截取的字段,第二个参数从哪里截取,第三个参数截取几个字符
SELECT SUBSTR(ENAME,1,1) FROM EMP;
#字符串拼接
SELECT CONCAT(MGR,SAL) FROM EMP;
3.length 字符串长度 trim 去除前后空格
SELECT LENGTH(JOB) FROM EMP;
SELECT JOB FROM EMP WHERE JOB = TRIM(' clerk');
4.coun 统计数量
SELECT COUNT(*) FROM EMP;
5.MAX最大值 MIN 最小值
SELECT MAX(MGR) FROM EMP;
SELECT MIN(MGR) FROM EMP;
6.sum 求和 avg 求平均数
SELECT SUM(MGR) FROM EMP;
SELECT AVG(MGR) FROM EMP;
7. case… when…then…when… then … else … end
SELECTJOB,SAL,( CASE ENAME WHEN 'SMITH' THEN 'lihuan' WHEN 'allen' THEN 'shehui' ELSE ENAME END ),( CASE SAL WHEN '800' THEN SAL * 2 ELSE SAL END )
FROMEMP;
8.去除重复数据(distinct)
SELECT DISTINCT(JOB) FROM EMP;
9.日期格式

str_to_date

str_to_date('01-10-2021','%d-%m-%Y')

date_format

date_format(birth,'%m/%d/%Y')

now()

SELECT NOW(); -- 获取当前时间

date datetime

date 短类型时间
datetime 长时间类型 带时分秒

6.5 分组查询 group by having

select … from … group by

-- 先以job分组 然后在执行select 后面的查询
SELECT JOB,SUM(sal) FROM EMP GROUP BY JOB;
-- 注意有group by 语句的话,select 后面只能跟分组的字段,以及分组函数,其他都不能跟-- having 可以对分完组之后的数据进一步过滤 having不能单独使用,having不能代替where having和group by 联合使用
-- 注意在where having 优先选择where
SELECT MAX(SAL),JOB FROM EMP GROUP BY JOB HAVING MAX(SAL) >3000

6.6 连接查询

1.不加条件查询

SELECT ENAME,DNAME FROM EMP,DEPT;#这种情况会出现笛卡尔积现象,笛卡尔积现象主要是说明,在执行sql语句的时候不加任何条件限制#避免第二卡机现象
SELECT ENAME,DNAME FROM EMP AS e,DEPT AS d WHERE e.DEPTNO = d.DEPTNO;

2.内连接

2.1内连接之等值查询

select … from … join … on… where…

SELECT e.ENAME,d.DNAME FROM EMP e JOIN DEPT d ON e.DEPTNO = d.DEPTNO;
SELECT e.ENAME,d.DNAME FROM EMP e inner JOIN DEPT d ON e.DEPTNO = d.DEPTNO;
2.2内连接之非等值查询
SELECT e.ENAME,a.HISAL FROM EMP e INNER JOIN SALGRADE a ON e.SAL BETWEEN a.LOSAL AND a.HISAL;
2.3内连接之自连接
SELECT a.ENAME,b.ENAME FROM EMP a INNER JOIN EMP b ON a.MGR=b.EMPNO;

3.外连接

selec … from …left join …on

select … from … raght join …on

# 外连接 左边表的数据全部展示,展示左外表的相关联数据
SELECT a.*,b.* FROM DEPT b  LEFT JOIN EMP a  ON a.DEPTNO = b.DEPTNO;
#外连接  右边表的数据全部展示,展示右边表的相关数据
SELECT a.*,b.* FROM EMP a RIGHT JOIN DEPT b ON a.DEPTNO = b.DEPTNO;

4.多表连接查询

select … from a join b on a和b的连接条件 join c b和c的连接条件

SELECTa.job,a.ENAME,b.DNAME,e.GRADE
FROMEMP aLEFT JOIN DEPT b ON a.DEPTNO = b.DEPTNOLEFT JOIN SALGRADE e ON a.SAL BETWEEN e.LOSAL AND e.HISAL;

5.子查询

1. where 语句中的子查询
SELECT * FROM EMP WHERE SAL > (SELECT MIN(SAL) FROM EMP);
2. from语句中的子查询
SELECTt.*,s.GRADE
FROM( SELECT JOB, AVG( SAL ) bb FROM EMP GROUP BY JOB ) t  -- 当做临时表JOIN SALGRADE s ON t.bb BETWEEN s.LOSAL AND s.HISAL;
-- 解析,首先查询出以job分组后的平均工资 和job数据。在以t表关联查询 t表的平均工资所在的等级,
3. union 合并结果集
SELECT ENAME,JOB FROM EMP WHERE JOB IN('CLERK','SALESMAN');
SELECT ENAME,JOB FROM EMP WHERE JOB='CLERK' OR JOB = 'SALESMAN';
-- 效率比较高 使用union结果集合并,列数相同。
SELECT ENAME,JOB FROM EMP WHERE JOB = 'CLERK'
UNION
SELECT ENAME,JOB FROM EMP WHERE JOB = 'SALESMAN';
4. limit 分页
-- 查询分页的效果,第一个参数代表从第几行开始,第二个参数代表差几条数据
SELECT * FROM EMP LIMIT 4,2;-- 公式
limit (pageNo-1) * pageSize,pageSize

7. 数据库的DDL,DML语句

7.1表的创建

CREATE TABLE Persons
(
Id_P int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)

7.2 数据类型

https://www.runoob.com/mysql/mysql-data-types.html

7.3 插入语句

INSERT INTO Persons (id_p,lastname,firstname,address,city) VALUES ('1','111','sss','ddd','aaa');INSERT INTO Persons  VALUES ('2','111','sss','ddd','aaa');-- 插入多条数据
INSERT INTO Persons
VALUES( '2', '111', 'sss', 'ddd', 'aaa' ),('3','111','sss','ddd','aaa' ),( '4', '111', 'sss', 'ddd', 'aaa' ),('5','111','sss','ddd','aaa' );

7.4 修改语句

UPDATE Persons SET lastname = "bbbb",address = 'dssss' WHERE id_p = 1;UPDATE Persons SET lastname = "bbbb" WHERE id_p = 1;

7.5 删除语句

DELETE FROM Persons WHERE id_p = 1;  -- 谨慎操作

8. 数据库的事务

1.概述

一个最小的不可再分的工作单元,通常一个事务对应一个完整的业务。

一个完整的业务需要批量的DML(insert,update,delte)语句共同完成的。

2.事务是如何做到同时成功和同时失败的

InnoDB存储引擎:提供一组用来记录事务性活动的日志文件

在事务的执行过程中,每一条DML的操作都会记录到“事务性活动的日志文件”中。

在事务的执行过程中,我们可以提交事务,也可以回滚事务。

redo log 和 undo log 前者重做日志 后者回滚日志

3.关闭自动提交

START TRANSACTION; -- 关闭自动提交机制
COMMIT;  -- 提交事务
ROLLBACK;  -- 回滚事务

4.事务的特性 ACID

原子性

一个事务必须被视为不可分割的最小工作单位,一个事务中的所有操作要么全部成功提交,要么全部失败回滚,对于一个事务来说不可能只执行其中的部分操作,这就是事务的原子性。

一致性

事务执行的前后都是合法的数据状态,不会违反任何的数据完整性

隔离性

主要是事务之间的相互的影响,根据隔离有不同的影响效果。

持久性

事务一旦提交,就会体现在数据库上,不能回滚。

5.事务特性之隔离性

1.事务和事务之间的隔离级别有哪些?
  • 读未提交:read uncommitted (最低的隔离级别)

    事务A读取到事务B未提交的数据 存在的问题是脏读现象

  • 读已提交:read committed

    事务A只能读取到事务B提交之后的数据,解决脏读现象,存在不可重复读现象(每次读取到的数据不一致)

  • 可重复读:repeatable read

    事务A每次读取到的数据 前后都是一致的,解决了不可重复读现象,出现幻读现象

  • 串行化:serializable (最高的隔离级别)

    每一次读取到的shu’ju都是最真实的,并且效率是最低的.线程退步,事务同步

高级

1.数据库架构逻辑

  • 1连接者:不同语言的代码程序和mysql的交互(SQL交互)
  • 2连接池 : 管理、缓冲用户的连接,线程处理等需要缓存的需求
  • 3管理服务和工具组件 : 系统管理和控制工具,例如备份恢复、Mysql复制、集群等
  • 4sql接口: 接受用户的SQL命令,并且返回用户需要查询的结果
  • 5查询解析器 SQL命令传递到解析器的时候会被解析器验证和解析(权限、语法结构)
  • 6查询优化器 SQL语句在查询之前会使用查询优化器对查询进行优化
  • 7缓存 如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据
  • 8插入式存储引擎 存储引擎说白了就是如何管理操作数据(存储数据、如何更新、查询数据等)的一种方法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)

分为四层:

  • 连接层:是客户端和连接服务。
  • 服务层:架构的核心服务功能,主要是SQL语句的逻辑部分
  • 引擎层:存储你引擎层真正的负责了MySQL中数据的存储和提取。(innoDB和MyISAM)
  • 存储层:数据存储层,主要是将数据存储在文件系统之上,并完成与存储引擎的交互

2.存储引擎

1.查看引擎命令

SHOW VARIABLES LIKE '%storage_engine%';

2.常用引擎

对比项 MyISAM InnoDB
事务 不支持 支持
主外键 不支持外键 支持
索引 非聚集索引(索引与数据分离,索引保存数据文件的指针) 聚集索引(索引和数据绑定在一起)
全文索引 支持 不支持
表空间
关注点 性能 事务

3.SQL 执行顺序

from->on->join->where->group by-> having->select->order by ->limit

4.索引概述

索引(Index)是帮助MySQL高效获取数据的数据结构

索引是数据结构,索引的目的是提高查询效率,可以类比英语新华字典,根据目录定位词语

5.索引优劣势

  • 优势:提高数据的检索效率,降低数据库的IO成本,降低数据排序的成本,降低了CPU的消耗

  • 劣势:同时会降低更新表的速度,如对表进行insert,update和delete,因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段,都会调整因为更新所带来的减值变化后的索引信息。

6.索引的分类

1.单值索引:

即一个索引只包含单个列,一个表可以有多个单列索引。

2.唯一索引:

索引列的值必须唯一,但允许有空值。

3.复合索引:

即一个索引包含了多个列

4基本语法:
create [unique] index indexName on table (columnname(length)); -- 创建索引
CREATE INDEX purchase_putId_indexName ON purchase(put_id); -- 案列SHOW INDEX FROM purchase;  -- 查看索引DROP INDEX purchase_projectName_indexName ON purchase; -- 删除索引

7.索引结构

1.BTree索引

2.Hash索引
3.full-text全文索引
4.R-Tree索引

8.什么情况建立索引

  • 主键自动建立唯一索引
  • 频繁作为查询条件的字段应该创建索引
  • 查询中与其它表关联的字段,外键关系建立索引
  • 频繁更新的字段不适合创建索引
  • Where条件里用不到的字段不创建索引
  • 在高并发情况创建组合索引
  • 查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度
  • 查询中统计或者分组字段

9.什么情况不建立索引

  • 表记录太少
  • 经常增删改的表
  • 数据重复且分布平均的表字段,因此应该只为最经常查询和最经常排序的数据建立索引。

10.索引优化

能做什么?

  1. 表的读取顺序 ID
  2. 数据读取操作的操作类型 select_type
  3. 哪些索引可以使用
  4. 哪些索引被实际使用
  5. 表之间的引用
  6. 每张表有多少行被优化器查询
1. explain
EXPLAIN SELECT * FROM data_template;  -- 语法解析

2. id分析
  • ID相同,执行顺序依次从上到下
  • ID不同,执行顺序为ID值越大优先执行
  • ID相同,又不同。ID值大的先执行,然后相同的依次顺序执行
3. select_type

查询的类型,主要是用于区别 普通查询,联合查询,子查询等的复杂查询

类型 说明
simple 简单的select查询,查询中不包含查询或者union
primary 查询中若包含任何复杂的子部分,最外层查询则被标记为
subquery 在select或where列表中包含了子查询
derived 在from列表中包含的子查询被标记为derived,递归执行这些子查询,把结果放到临时表
union 若第二个select出现在union之后,则标记为union,若union包含在from字句子查询,外层select标记为:derived
union result 从union表获取结果的select
4. table

显示这一行的数据是关于哪张表的

5. type

访问类型排列,显示使用了哪种排列

从最好到最差依次是:

system>const>eq_ref>ref>range>index>ALL

达到range 和ref最好

  1. system:表只有一行记记录,这是const类型的特列,平时不会出现,可以忽略
  2. const:表示通过索引一次就找到了,const用于比较primary key或者unique索引,因为只匹配一行数据,所以很快将主键置于where列表中,MySQL就能将该查询转换为一个常量
  3. eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描。
  4. **ref:**非唯一性索引扫描,返回匹配某个单独值的所有行,可能会找到多个符合条件的行,属于查找和扫描的混合体
  5. range:只检索给定范围的行,使用一个索引来选择行,key列显示使用了哪个索引一般就是在你的where语句中出现了between.<.>.in等的查询,这种范围扫描索引比全表扫描要好。、
  6. index:index类型只遍历索引树,这通常情况比ALL快,因为索引文件比数据文件小,但index从索引总读取的,而all是硬盘中读取的.
  7. **all:**将遍历全表以找到匹配的行
6. possible_keys

显示可能应用在这张表中的索引,但不一定被查询实际使用。

7. key

实际使用的索引,如果为null,则没有使用到索引。查询中若用了覆盖索引,则该索引仅出现在key列表中.

8. key_len

表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度.在不损失精确性的情况下,长度越短越好

显示的值为索引字段的最大可能长度,并非实际使用长度。即key_len是根据表定义计算而得,不是通过表内检索出的。

9. ref

显示索引的哪一列被使用了,如果可能的话,是一个常数.哪些列或常量被用于查找索引列上的值

10. rows

根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数

11. extry

重要的额外信息

  • Using filesort:说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。MySQL中无法利用索引完成的排序操作称为“文件排序”
  • Using temporary: 使用了临时表保存中间结果,MySQL在对查询结果排序时使用临时表,常见于排序Order by 和分组查询group by
  • **Using index:**表示相应的select操作中使用了覆盖索引,避免访问了表的数据行。如果同时出现using where,表明索引被用来执行索引键值的查找》如果没有同时出现using where,表明索引用来读取数据而非执行查找动作。
  • Using where:表明使用了where
  • using join buffer:使用了连接缓存
  • impossible where:where子句的值总是fals,不能用来获取任何组
  • select tables optimized away:没有gruopby子句的情况下,基于索引优化min/max操作或者对于myISAM存储引擎优化count(*)操作,不比等到执行阶段在进行计算.查询执行计划生成的阶段即完成优化。
  • distinct:优化distinct操作,在找到第一匹配的元祖后即停止找同样值的动作。

11.索引失效原因

create index idx_name on city(city_name,age,sex); -- 创建索引
  • 全值匹配,对索引中的列都指定具体值。
  • 最左前缀索引法则
    • city_name age 走索引
    • city_name sex 走索引 走city_name的索引
    • age sex 不走索引
    • city_name 走索引
  • 不要再索引列上做任何操作,会导致索引失效而转向全表扫描。
  • 范围查询的SQL语句 ,右边的列索引都失效
  • 尽量使用覆盖索引,查询所需要的列,避免(select*),会有回表的查询。
  • mysql在不使用不等于(!=或者<>)的时候无法使用索引会导致全表扫描
  • is null ,is not null 也无法使用索引
  • 以%开头的Like模糊查询,索引失效。如果仅仅尾部匹配,索引不会失效。如果是头部模糊匹配,索引失效。解决:可以使用覆盖索引来解决
  • 字符串不加单引号索引失效
  • 少用or,用它来连接时会索引是失效。

12 查询优化

  • 永远小表驱动大表
  • order by 优化 依次使用索引,索引不要中断
  • group by 优化 依次使用索引,索引不要中断
  • in和exists优化, 数据量大使用exists exists是返回数据的true

13 慢查询日志

1. 什么是慢查询日志
  • MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录子啊MySQL中响应时间超过阈值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中.
  • long_query_time值的SQL,默认值为10,意思是10秒以上的语句。
2. 查看是否开启
SHOW VARIABLES LIKE '%slow_query_log%';  -- 查看是否开启慢SQL
SHOW VARIABLES LIKE 'long_query_time%';  -- 查看慢SQL记录时间
SHOW GLOBAL STATUS LIKE '%Slow_queries%'; -- 查看慢SQL有几条记录
3.开启慢查询日志
set global show_query_log = 1;  -- MySql重启就失效
-- 也可以配置my.cnf永久开启慢查询日志

14 show profiles

1.是mysql提供可以用来分析当前会话中语句执行的资源消耗情况。可以用于SQL的调优测量。

1. 查看是否开启
SHOW VARIABLES LIKE 'profiling';  -- 查看是否开启
SET profiling = on; -- 设置开启show profiles; -- 查看执行的SQL语句
show profiles cpu,block io for query ID; -- 诊断SQL
2. 查询全局 日志
set global general_log =1;
set global log_output ='TABLE';

15 锁的机制

SHOW OPEN TABLES; -- 查看数据库是否加锁
unlock tables;   -- 表全部解锁
1.表锁(引擎是 MyISAM)

偏向MyISAM存储引擎,开销小,加锁快,无死锁,锁定粒度大,发生锁冲突的概率最高,并发度低

1.读锁(共享锁)
lock table  表名  read;
  • 在session 给表增加读锁后,只能查询加锁的表,不能查询其他表,不能修改上锁的表数据。
  • 其他session可以查询加锁表,也可以查询没加锁表,修改加锁表的数据,会出现等待状态。
2.写锁(排它锁)
LOCK TABLE 表名 WRITE;
  • 在session给表增加写锁后,只能查询加锁的表,不能查询其他表,可以修改上锁的表的数据
  • 其他seesion查询加锁表会阻塞,不能修改数据,可以查询其他表

简而言之,就是读锁会阻塞写,但是不会堵塞读。而写锁则会把读和写都堵塞

3.查看表锁分析
 SHOW STATUS LIKE 'table%';

MyISAM 多适用于偏度的操作,MyISAM的锁调度是写优先。

2.行锁

偏向InnoDB存储引擎,开销大,加锁慢:会出现死锁,锁定粒度小,发生锁冲突的概率最低,并发度也最高

  • 索引失效行锁会变表锁
1.行锁分析
show status like 'innodb_row_lok%';
3.间隙锁
  • 在执行范围查找的话,mysql会锁定整个范围内的所有索引键值,即使这个键值不存在,对于键值在条件范围内但并不存在的记录,叫做"间隙"
4.如何锁定一行
-- A事务BEGINSELECT * FROM EMP WHERE EMPNO = "7369" FOR UPDATE;-- 不执行提交事务 B事务永远等待
COMMIT-- B 事务
UPDATE EMP SET ENAME = "aaa" WHERE EMPNO = "7369";

MySQL基础入门到索引优化相关推荐

  1. MySQL基础入门【3】

    文章目录 13 补充知识,查询结果的去重 14 连接查询 14.1 什么是连接查询? 14.2 连接查询的分类? 14.3 基础知识 补充,表的别名 14.4 内连接 等值连接 非等值连接 自连接 1 ...

  2. ElasticSearch基础杂烩-配置-索引-优化

    2019独角兽企业重金招聘Python工程师标准>>> ElasticSearch基础杂烩-配置-索引-优化 博客分类: java 前言 ElasticSearch是一个基于Luce ...

  3. mysql设计思想_这些Mysql基础设计思路以及优化思路我都给你总结好了

    原标题:这些Mysql基础设计思路以及优化思路我都给你总结好了 1.定长和不定长要区分开 2.不常用的列和常用的列分开存 3.增加冗余,反范式化 4.btree索引,就是用树形结构存储在磁盘上,其中操 ...

  4. psql where里有自定义函数慢_阿里P8架构师谈:MySQL慢查询优化、索引优化、以及表等优化总结...

    MySQL优化概述 MySQL数据库常见的两个瓶颈是:CPU和I/O的瓶颈. CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据时候. 磁盘I/O瓶颈发生在装入数据远大于内存容量的时候,如果应 ...

  5. mysql模糊查询之索引优化

    mysql模糊查询之索引优化 三表连查之模糊查询索引优化 注:具体用法10和11步骤. 1.t_project表 DROP TABLE IF EXISTS `t_project`; CREATE TA ...

  6. 自己总结的MySQL基础入门知识,附思维导图

    第一次写博文,问题点可能比较多,辛苦大家帮忙指正,感谢大家. MySQL基础入门知识 前言 一.数据库基础知识 1.什么是数据库 2.数据库的分类 3.数据库的常用语言 4.数据库的常用操作方式 5. ...

  7. 【MySQL调优】索引优化

    写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^ 6条记录,DBMS的页面大小为4K,并存储100条记录.如果没有索引,查询 ...

  8. mysql 同一张表 某个字段更新到另一条数据上_面试基础:数据库MySQL基础入门(下)...

    本文是面试基础的第二篇.本篇偏理论,包括三节: 事务和并发 数据库设计 索引 所选的三个内容均是面试的高频考察点,需要细致地理解 No.1     事务和并发 事务:数据库操作的基本单元.对于数据库的 ...

  9. MySQL高级篇知识点——索引优化与查询优化

    目录 1.数据准备 1.1.建库建表 1.2.创建相关函数 1.3.创建存储过程 1.4.调用存储过程 1.5.删除某表上的索引 2.索引失效案例 2.1.全值匹配 2.2.最佳左前缀匹配原则 2.3 ...

最新文章

  1. 使用P3P共享Cookie与Session小结
  2. MongoDB增加用户认证:增加用户、删除用户、修改用户密码、读写权限、只读权限...
  3. linux内核匹配的编译器gcc,linux下正则匹配的C实现
  4. php 旋转图片 并保存,如何在PHP中旋转并保存图像
  5. spring-retry_使用Spring-Retry重试处理
  6. java ejb jsp 架构_JavaEE架构
  7. java英文单词单复数转换
  8. 为什么跨境电商独立站将成为几年的焦点?
  9. Linux kernel tick发起调度软中断函数调用图
  10. c语言大神,C语言入门大神有话说(一)
  11. c语言实现统计过程控制,SPC统计过程控制
  12. Java通过SSH实现文件上传下载功能
  13. Qt5下载与安装(Windows版)
  14. jvisualvm监控本地jvm
  15. 项目管理中的变更管理是什么?
  16. fms安装教程 linux_linux通过fms搭建流媒体服务器Flash Media Server
  17. PLC网关是什么 PLC网关是做什么的
  18. 程序员代码面试指南刷题--第五章.字符串的调整II
  19. Windows搭建nexus3.xx
  20. 组合导航(二):导航参考坐标系

热门文章

  1. ESP8266和DHT11通讯
  2. rk watchdog 看门狗配置,rockchip
  3. Tomcat配置阿里云SSL证书
  4. 量子计算机时空穿越,量子世界里的怪异现象,人类进行时间穿越,也不会引发蝴蝶效应...
  5. 如何参加“动物杂交:新视野”自然日活动
  6. 电脑总是无故自动关机、自动重启和死机原因
  7. 服务器配置反向代理实现域名访问服务器端口
  8. npm run build:prod打包步骤
  9. HTTP/1.1详解
  10. Apache DbUtils工具类初学