MySQL面试查缺补漏
- 开发软件
- 1小时前
- 3热度
- 0评论
https://www.bilibili.com/video/BV1aE41117sk?p=7 非常好的索引课
https://www.bilibili.com/video/BV1UQ4y1P7Xr?p=59 SQL高级教程,很好
基础
满足ACID的一组操作,可以通过commit提交的一个事物,也可以用rollback回滚
- Atomicity 原子性:不可分,要么全部成功,要么全部失败
- Consistency 一致性:数据库执行事物前后保持一致性,所有事物对同一个数据的读取结果相同
- isolation 隔离性:一个事物最终修改前对其他事物不可见
- durability 持久性:一旦事物提交,则所作的修改会永远保存道数据库中,即使系统崩溃,事物执行的结果也不能丢
索引(简单介绍,详细在高级篇)
索引:帮助MySQL高效获取数据的排好序的数据结构
分类
- 单值索引:对一个列建索引,一个表可以有多个
- 唯一索引:这一列必须每个值都唯一(允许多个空或null)
- 联合索引:一个索引包含多个列
名词解释:
- 聚集索引:按主键构建B+树,data放当前行的所有数据,InnoDB是聚集索引
- 非聚簇索引:按主键构建B+树,data放当其他文件,MyISAM室非聚集索引
- 辅助索引(二级索引):按一个字段构建B+树,data放主键的ID
- 覆盖索引:搜索的字段刚好都是索引字段,这样不用回表查询
主键:主键 = 非空值+唯一索引,主键不实际存在只是个逻辑
- 主键:主键的B+数结构叶子节点存的是整行的值,非主键索引存的是主键ID
数据结构
- 红黑树(某些场景不适应,所以没用,数据量太大了还是会慢)
- Hash表(很好)
- B+Tree(主要)
优势
- 提交检索效率,降低数据库IO成本
- 通过索引对数据排序,降低排序成本
劣势
- 占用空间
- 降低插入更新删除操作的时间
# 【创建索引】在city表为city_name列创建一个名为idx_cn的索引
CREATE INDEX idx_cn on city(city_name)
# 【查看索引】
SHOW INDEX from city
# 【删除索引】
DROP INDEX idx_cn FROM on city
#【Alter命令】创建主键索引(唯一且不能为null)
alter table tb_name add primary key(column_list)
#【Alter命令】创建唯一索引,创建普通索引把union换成index
# index_name索引名称,column_list列名
alter table tb_name add union index_name(column_list)
#【Alter命令】全文索引
alter table tb_name add fulltext index_name(column_list)
索引的设计原则
- 查询频率高,数据量大的表
- where中经常出现的
- 尽量用唯一索引,区分度越高索引效率越高
- 索引多了也不好,影响插入更新删除效率,并且Mysql还要选择一个最好的索引也需要花时间
- 索引的长度短(因为创建索引也要用硬盘存)
- 最左前缀,N个列创建组合索引,相当于创建了N个索引,如果查询时where子句用了组成该索引的前几个字段,那么这条查询SQL可以用联合索引提高效率
视图
概念:虚拟表,并不在数据库中实际存在。使用时动态生成,视图就是SELECT语句执行后返回的结果集。创建视图主要工具就在SQL上了。
==视图比普通表的优势==
- 简单:使用视图不需要关心后面对应表结果、关联条件、筛选条件
- 安全:只能访问被允许查询的结构,通过视图可以限制到行和列
- 数据独立:表结构增加列,视图不变。 表结构更新就更新视图
# 如果要联合两个表查询,很麻烦
select c.*,t.country_name from city c, contry t where c.country_id = t.country_id;
# 【创建视图】用视图替换
create view view_city_country as 上面的语句
# 【查询视图】直接当表操作
select * from view_city_country
# 【更新视图】实际上更新基表的数据
update view_city_country set city_name = '西安' where city_id = 1;
# 【删除视图】
drop view view_city_country
# 【查看有哪些视图】
show tables
存储过程和函数
概念:事先编译好的存储在数据库中的一段SQL语句的集合 好处:减少开发量,降低数据库与应用服务器之间的传输
- 函数:有返回值
- 过程:无返回值
# 【创建存储过程】
delimiter $ // 申明分隔符是$,不然默认是;
create procedure test1()
begin
select * from city;
end$
# 【调用存储过程】
call test1()$
# 【查看存储构成】三种方式
select name from mysql.proc where db='city'; # mysql数据库中所有存储信息
show procedure status;
show create procedure test1; # 看这个存储过程的怎么定义的
# 【删除存储过程】
drop procedure test1;
存储过程语法
# 待学习,暂时没时间
https://www.bilibili.com/video/BV1UQ4y1P7Xr?p=16
触发器
概念:可以在insert/update/delete之前或之后执行触发器中定义的SQL语句
用处:帮助确保数据完整性、日志记录、数据校验
触发器代码
# 待学习
https://www.bilibili.com/video/BV1UQ4y1P7Xr?p=28
日志
- 错误日志
- 二进制日志
- 查询日志
- 慢日志:默认关闭,开启后设置long_query_log=10,sql时间超10秒就需要记录
