MySQL基础入门到索引优化
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.索引优化
能做什么?
- 表的读取顺序 ID
- 数据读取操作的操作类型 select_type
- 哪些索引可以使用
- 哪些索引被实际使用
- 表之间的引用
- 每张表有多少行被优化器查询
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最好
- system:表只有一行记记录,这是const类型的特列,平时不会出现,可以忽略
- const:表示通过索引一次就找到了,const用于比较primary key或者unique索引,因为只匹配一行数据,所以很快将主键置于where列表中,MySQL就能将该查询转换为一个常量
- eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描。
- **ref:**非唯一性索引扫描,返回匹配某个单独值的所有行,可能会找到多个符合条件的行,属于查找和扫描的混合体
- range:只检索给定范围的行,使用一个索引来选择行,key列显示使用了哪个索引一般就是在你的where语句中出现了between.<.>.in等的查询,这种范围扫描索引比全表扫描要好。、
- index:index类型只遍历索引树,这通常情况比ALL快,因为索引文件比数据文件小,但index从索引总读取的,而all是硬盘中读取的.
- **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基础入门到索引优化相关推荐
- MySQL基础入门【3】
文章目录 13 补充知识,查询结果的去重 14 连接查询 14.1 什么是连接查询? 14.2 连接查询的分类? 14.3 基础知识 补充,表的别名 14.4 内连接 等值连接 非等值连接 自连接 1 ...
- ElasticSearch基础杂烩-配置-索引-优化
2019独角兽企业重金招聘Python工程师标准>>> ElasticSearch基础杂烩-配置-索引-优化 博客分类: java 前言 ElasticSearch是一个基于Luce ...
- mysql设计思想_这些Mysql基础设计思路以及优化思路我都给你总结好了
原标题:这些Mysql基础设计思路以及优化思路我都给你总结好了 1.定长和不定长要区分开 2.不常用的列和常用的列分开存 3.增加冗余,反范式化 4.btree索引,就是用树形结构存储在磁盘上,其中操 ...
- psql where里有自定义函数慢_阿里P8架构师谈:MySQL慢查询优化、索引优化、以及表等优化总结...
MySQL优化概述 MySQL数据库常见的两个瓶颈是:CPU和I/O的瓶颈. CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据时候. 磁盘I/O瓶颈发生在装入数据远大于内存容量的时候,如果应 ...
- mysql模糊查询之索引优化
mysql模糊查询之索引优化 三表连查之模糊查询索引优化 注:具体用法10和11步骤. 1.t_project表 DROP TABLE IF EXISTS `t_project`; CREATE TA ...
- 自己总结的MySQL基础入门知识,附思维导图
第一次写博文,问题点可能比较多,辛苦大家帮忙指正,感谢大家. MySQL基础入门知识 前言 一.数据库基础知识 1.什么是数据库 2.数据库的分类 3.数据库的常用语言 4.数据库的常用操作方式 5. ...
- 【MySQL调优】索引优化
写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^ 6条记录,DBMS的页面大小为4K,并存储100条记录.如果没有索引,查询 ...
- mysql 同一张表 某个字段更新到另一条数据上_面试基础:数据库MySQL基础入门(下)...
本文是面试基础的第二篇.本篇偏理论,包括三节: 事务和并发 数据库设计 索引 所选的三个内容均是面试的高频考察点,需要细致地理解 No.1 事务和并发 事务:数据库操作的基本单元.对于数据库的 ...
- MySQL高级篇知识点——索引优化与查询优化
目录 1.数据准备 1.1.建库建表 1.2.创建相关函数 1.3.创建存储过程 1.4.调用存储过程 1.5.删除某表上的索引 2.索引失效案例 2.1.全值匹配 2.2.最佳左前缀匹配原则 2.3 ...
最新文章
- 使用P3P共享Cookie与Session小结
- MongoDB增加用户认证:增加用户、删除用户、修改用户密码、读写权限、只读权限...
- linux内核匹配的编译器gcc,linux下正则匹配的C实现
- php 旋转图片 并保存,如何在PHP中旋转并保存图像
- spring-retry_使用Spring-Retry重试处理
- java ejb jsp 架构_JavaEE架构
- java英文单词单复数转换
- 为什么跨境电商独立站将成为几年的焦点?
- Linux kernel tick发起调度软中断函数调用图
- c语言大神,C语言入门大神有话说(一)
- c语言实现统计过程控制,SPC统计过程控制
- Java通过SSH实现文件上传下载功能
- Qt5下载与安装(Windows版)
- jvisualvm监控本地jvm
- 项目管理中的变更管理是什么?
- fms安装教程 linux_linux通过fms搭建流媒体服务器Flash Media Server
- PLC网关是什么 PLC网关是做什么的
- 程序员代码面试指南刷题--第五章.字符串的调整II
- Windows搭建nexus3.xx
- 组合导航(二):导航参考坐标系