本文根据CSDN MySQL进阶技能树整理的易错知识点,参考资料MySQL八股文连环45问,你能坚持第几问?
general_log = 1
, 配置general_log_file
路径),可参考MySQL 数据库管理之 — 日志查询long_query_time
秒的语句,可以找到哪些查询语句执行时间长,以便提醒优化;设置slow_log = 1
, 配置slow_log_file
路径),可参考MySQL 慢查询,MySQL 数据库管理之 — 日志查询log_error
路径),可参考MySQL 数据库管理之 — 日志查询log_bin
路径),可参考MySQL 数据库管理之 — 日志查询,MySQL二进制日志 - 恢复数据mysqldump
)GRANT
可创建带有明文密码的用户,可赋予用户在某表上的增/删/查的权限),创建用户2,可参考详细介绍MySQL中的用户与权限管理CREATE USER 'kangshifu'@'localhost' IDENTIFIED BY '123456';
,主机名为localhost
,密码为123456
GRANT ALL PRIVILEGES ON *.* TO joe@'%' IDENTIFIED BY '123';
ALL PRIVILEGES
:赋予所有权限ON *.*
:指定权限针对所有库和表joe@'localhost’
表示joe用户,@
后面接跟制的主机(比如192.168.136.128
),可以是P、P段、域名以及%,%
表示任何地方。grant select on table employee to joe
),可参考详细介绍MySQL中的用户与权限管理create role
:为相同权限的用户统一用一个角色来管理),可参考详细介绍MySQL中的用户与权限管理#Joe 现在是团队的 DBA,公司数据分析组有 Fred、Alice、James、Jone 四位成员,现在Joe需要给数据分析组授权,允许他们 查询 MySQL 8 服务器 goods 数据库中的所有表
create role analysis;
grant analysis to fred, alice, james, jone;
grant select on goods.* to analysis;
flush privileges;
DROP ROLE analysis, manager
。SHOW GRANTS FOR 'username'@'hostname';
),可参考查看用户权限revoke select on trade from fred;
),可参考MySQL撤销(revoke)用户权限alter
不用update
),删除用户(drop
),可参考MySQL修改用户密码,mysql如何查看用户及其权限update mysql.user set password = password('newPassword') where user = 'root' and host = 'localhost';
alter user 'fred'@'%' identified by 'goods123fred' password expire;
alter user .. with ..
,可参考MySQL 资源限制MAX_QUERIES_PER_HOUR
:某用户每小时可以执行的查询次数MAX_UPDATES_PER_HOUR
:某用户每小时可以执行的修改语句次数MAX_CONNECTIONS_PER_HOUR
:某用户每小时最多可以连接多少次MAX_USER_CONNECTIONS
:某用户可同时连接到数据库的会话数量alter user analysis with MAX_QUERIES_PER_HOUR 10000;
参考MySQL索引的概念以及七种索引类型介绍,MySQL的索引(普通索引、唯一索引,主键索引、组合索引、全文索引、空间索引)相关操作
category_id
)下没有重名(name
)的商品,可以建立由两个字段构成的、带唯一约束的联合索引: alter table goods add unique index (category_id, name);
),可参考MySQL索引的创建与使用select price from goods where name = '...''
,可以通过为查询的字段(name
和price
)增加索引来优化sql查询:alter table goods add index (name, price);
),可参考全值匹配(可以优化查询、修改语句)select id, category_id, name, price from goods where name=? and category_id=?
, 性能很可以通过将该查询改写为 select id, category_id, name, price from goods where category_id=? and name=?;
来优化),可参考Mysql最左匹配原则(a,b,c)
这3个字段构成的联合索引,B+树如下图所示。可以看到a的值是有顺序的,1,1,2,2,3,3,而b的值是没有顺序的1,2,1,4,1,2;而在a相等时,b是有序的。where
子句几个搜索条件顺序调换不影响查询结果,因为Mysql
中有查询优化器,会自动优化查询顺序):select * from table_name where a = '1' and b = '2' and c = '3'
select * from table_name where b = '2' and a = '1' and c = '3'
select * from table_name where c = '3' and b = '2' and a = '1'
......
select * from table_name where a = '1'
select * from table_name where a = '1' and b = '2'
select * from table_name where a = '1' and b = '2' and c = '3'
select * from table_name where b = '2'
select * from table_name where c = '3'
select * from table_name where b = '1' and c = '3'
select * from table_name where a = '1' and c = '3'
select * from test where a <10;
会走索引,但是select * from test where a >10
,原因是预分析sql的时候认为a>10
的数据量太大,不如全表扫描,就会不走索引。5.7
之后的版本支持了空间索引,而且支持OpenGIS几何数据模型GEOMETRY、POINT、LINESTRING、POLYGON
。create table shop (
id int primary key auto_increment,
location GEOMETRY
-- ...
)
alter table shop modify location GEOMETRY not null;
alter table shop add INDEX geo_index(location);
ALTER TABLE table_name ADD FULLTEXT (column);
),参考MySQL索引的概念以及七种索引类型介绍alter table shop alter index description invisible ;
将索引隐藏,观察确认没有影响后再执行drop index
)date(payment_date)
查询次数比较多时,可以建立表达式索引:alter table payment add index idx_payment_date((date(payment_date)));
)with recursive temp(id,pid) as ...
定义带查询字段id
,pid
的递归函数,最终temp
返回的是一张带id
,pid
的虚表),树结构溯根,可参考mysql 递归函数with recursive的用法,MySQL8-WITH RECURSIVE递归查询父子集with recursive temp(id,pid) as (..clause..)
中的clause
一般伴随着union
或union All
一起使用,参考SQL UNION 和 UNION ALL 操作符WITH RECURSIVE fibonacci (n, fib_n, next_fib_n) AS
(
SELECT 1, 0, 1
UNION ALL
SELECT n + 1, next_fib_n, fib_n + next_fib_n
FROM fibonacci WHERE n < 10
)
SELECT * FROM fibonacci;
---
+------+-------+------------+
| n | fib_n | next_fib_n |
+------+-------+------------+
| 1 | 0 | 1 |
| 2 | 1 | 1 |
| 3 | 1 | 2 |
| 4 | 2 | 3 |
| 5 | 3 | 5 |
| 6 | 5 | 8 |
| 7 | 8 | 13 |
| 8 | 13 | 21 |
| 9 | 21 | 34 |
| 10 | 34 | 55 |
+------+-------+------------+
with recursive t(id, pid, val) as (
select id, pid, val
from node
where id = $1
union all
select node.id, node.pid, node.val
from node
join t on node.id = t.pid)
select node.id, node.pid, node.val
from node
join t on node.id = t.id;
rank()
:TopK问题,比如给出每个部门工资最高的前5个员工的信息;rank()
常伴随着order by
和partition by
一起使用,参考Mysql常用函数之Rank 排名函数try ... catch ... finally
)T1
和T2
, T1
读取了已经被 T2
更新(update
) 但还没有被提交(commit
)的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的( T2 update
→
\rightarrow
→ T1 read
→
\rightarrow
→ T2 rollback
).T1
和T2
,T1
读取了一个字段, 然后 T2
更新(update
)了该字段之后, T1
再次读取同一个字段, 值就不同了(T1 read
→
\rightarrow
→ T2 update
→
\rightarrow
→ T1 read
).T1
和T2
, T1
从一个表中读取了一个字段, 然后 T2
在该表中插入了一些新的行之后, 如果 T1 再次读取同一个表, 就会多出几行(T1 read
→
\rightarrow
→ T2 insert
→
\rightarrow
→ T1 read
)if ... then ... end if
)[label] Loop...end Loop [label]
,其中ITERATE [label]
相当于continue
,LEAVE [label]
相当于break
)REPEAT UNTIL
语句中不管是否满足给定条件,首先会执行一次statements
),参考mysql repeat循环语句WHILE ... DO ... END WHILE
)REPEAT
循环语句REPEAT
Statements;
UNTIL expression
END REPEAT
WHILE
语法结构:[label:] WHILE search_condition DO
statement list
END WHILE [label]
CLOSE 游标名
关闭游标,用OPEN 游标名
打开游标),游标的使用