本文根据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,密码为123456GRANT 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 游标名打开游标),游标的使用