-
什么是索引?
索引是一个数据结构,可以提高查询效率, -
索引是什么样的数据结构
InnoDB存储引擎默认索引实现为B+树索引 -
在建立索引时需要考虑哪些因素?
把使用频率高,经常作为条件的字段适合进行建立索引,
使用联合索引要注意想要命中索引需要按照建立索引的字段顺序挨个使用,否则无法命中, -
创建的索引有没有被使用到,怎么样才能知道这条sql运行很慢呢?
可以使用explain命令来查询语句的执行过程,mysql在执行一条sql时会先进行编译,分析,优化,生成执行计划,
可以在执行计划中通过和索引有关的信息进行分析是否使用了索引,可以查看possilbe_key,key,key_len等字段,说明了
此语句可能会使用的索引,实际上使用的索引,使用索引的长度, -
在什么情况下在查询时没有走索引
使用不等于查询,!=
列参与了数学运算或者函数,
在模糊查询时(like)左边开头是通配符, -
什么是事务
事务是一个完整的处理事情的过程,符合ACID特性 -
什么是ACID
A 原子性 要么都执行,要么都不执行,不可能只执行一部分
C 一致性 状态转化前后不会发生中间状态
I 隔离性 事务与事务之间具有隔离
D 持久性 事务一旦提交后 结果不会在发生变化了, -
同时有多个事务会怎么样
多个事务并发运行会发生以下几个问题
1 脏读: a事务读取到了b事务未提交的内容,并且b事务还回滚了啊,这就出现了错误。
2 不可重复读:在一个事务内根据同一个条件对行记录进行了多次查询,但是搜出来的结果却不一样,原因就是查询的数据被另一个事 务执行过并提交了,毕竟是读取到的是已提交的数据,是可以容忍的吧
3幻读: 指得是在一个事务内,多次查询一个条件下的数据,结果集却是不相同的,多了或是少了,这样就是产生了幻觉,为什么多次查询结果集不一样呢?其实就是和不可重复读一样,同一个记录数据被另一个事务修改了,但是幻读读的是数据行记录变多或是变少,而不可重复读是读的是数据内容发生了变化,
总结一下:脏读就是在一个事务内读取到了另一个事务未提交的数据,并且数据还回滚了,不可重复读是指 在一个事务内根据一个条件多次查询一行数据的值是不一样的,幻读是在一个事务内根据一个条件查询出来的结果集,就是记录行数不一样,为了解决事务并发的问题才有了事务隔离级别
-
事务级别
读未提交 :就是可以产生脏读,这个级别没啥用
读已提交:可以产生不可重复读的尴尬,
可重复读:解决了不可重复读的尴尬但是还是会发生幻读,
可串行化:解决所有问题,
等级越高 性能越低,
mysql的innoDB默认是使用可重复读, -
对mysql的锁有了解吗?
当数据库有并发事务时,可能对同一个数据进行操作,需要一个机制来保证对数据的访问次序,这就是锁的作用,
就像酒店的房间一样,如果多个人同时对一个房间进行吃住,那么谁到底是房的主人呢?还不如给房间加上锁,谁有钥匙谁才有资格住, -
mysql中的锁机制有哪些
锁的类别可以分为是共享锁和排它锁,
共享锁是读锁,共享锁可以同时多个事务读取
排他锁是写锁,当事务进行操作时,只能有一个事务进行数据操作,
可以这么说,一个房间可以被多个客人查看,但不能被多个客人同时住下来吧
锁的颗粒度可以分成行级锁,页级锁,表级锁, -
为什么要设置一个主键
主键的作用是在一张表中保证一行数据的唯一性,即使没有主键也要设置一个自动增长的主键
设置主键后可以快速的定义一行数据, -
字段为什么不要设置成null值
null会占用更多的字节,查询出来可能会发生错误, -
密码固定位数用什么字段类型
char 固定类型,节省空间 -
sql语句的优化方向
分析语句 是否有多余无用的数据被查询出来,
分析sql执行计划,获取索引使用情况,是语句尽可能命中索引
可以考虑是不是表中的数据量太大了,可以进行对表横向或是纵向分表, -
什么是存储过程
就是预编译sql语句的结果集,方便使用调用查询 -
mysql的逻辑架构
客户端——连接器(管理连接,权限验证)——查询缓存(命中则直接返回)
——分析器(语法分析)——优化器(执行计划,索引执行)——执行器(操作引擎)——存储引擎(存放数据的)
第一层负责连接处理,授权认证,安全等
第二层负责编译优化sql,
第三层存储数据引擎, -
一条sql是如何执行的
先检查该语句,是否有权限,如果没有权限,直接返回错误信息,如果有权限会先查询缓存,
如果没有缓存,分析器先进行词法分析,就是检验关键字,
再进行编译器作出sql正确性,
在经过优化器提高sql的执行效率, -
sql优化
一,优化表结构
1,尽量使用数字型字段,数字查询比较是一次,字符比较是每个字符都会比较,
2,使用varchar类型代替char
3,索引是重复数据时,不需要使用索引
二, sql优化查询
避免select *
避免where 后面是 !=
where 后面不要使用多个或是超过三个or来连接条件 ,
避免where后面对字段进行null判断
三,索引优化
order by 分组后面的字段建立索引, -
三大范式 一定要记住
第一范式 字段具有原子性 不可分割,单一职责
第二范式 表中的每一行都具备有唯一性标识 就是设置主键
第三范式 每一列字段都要主键是直接相关,不是间接相关
表中的三大范式 字段 行唯一 字段和主键的直接关系 -
innoDB支持事务 myisam不支持事务 ,
innoDB支持外键,innoDB是使用B+Tree作为索引结构,
innoDB有日志
innoDB支持行锁 和表锁 -
查询语句是怎么执行的?
客户端写SQL 通过连接器来做身份和权限处理,先进行缓存查询,如果不命中则进行分析器对sql语法和词法进行分析,就是关键字和参数
进入优化器生成执行计划和选择索引, -
什么是事务?
事务是指一个操作的完成过程,这个过程结果只有一个,成功或是失败,
事务的四大特点:原子性,一致性,隔离性,持久性,
原子性:要么是成功要么是失败,不可分割,
一致性:事务前后的数据的完整性要一致性,
隔离性:事务之间相互隔离,互不干扰,
持久性:事务执行成功后状态是持久的,
事务的隔离级别:
可串行化:事务最高级别 事务依次运行,
可重复读:事务之内 数据是一致的,不会发生改变
读未提交:一个事务读取到另一个事务中未提交的数据,
读提交:一个事务内读取到另一个事务已经提交的数据
不同事务级别可能会发生的情况:
脏读:一个事务内读取到了另一个 事务未提交的数据,说明这个数据可能是提交或是回滚 这就是脏读,
幻读:一个事务内操作添加或是修改一行数据,另一个事务也同时操作了这条数据并已提交了,这个会发现修改无效,
不可重复读是:同一个事务内不同时刻查询同一个条数据是不一样的,
oracle和mysql默认的可重复读级别:
- 一条sql语句查询很慢的原因是什么?
因为使用了函数导致没有走索引,或是本身没有索引,
表中的数据量很大,日志满了 ,使用delete删除时其实是逻辑删除,所以表空间不会变小,
-- 如何创建和删除库呢
create database name;
drop database name;
-- innDB
InnDB支持事务
支持行级锁,支持外键,
-- char 固定长度字符串类型 varchar 可变字符长度
-- 获取当前时间 select current_date();
-- 获取当前数据库版本 select version();
-- 触发器 指一段代码 当触发了一个事件之后开始执执行 6种触发器
before insert 添加之前
after insert 添加之后
before update 更新之前
after update 更新之后
before delete 删除之前
after delete 删除之后
在字段进行处理时可以使用
-- mysql显示前50行
select * from tablename limit 0,50 ;
-- 数据库字符类型 int char varchar datetime text 大文本 blob 存放二进制数据
-- mysql中的事务
1 原子性:一个事务要不成功要不失败
2 一致性:在事务之前和之后要保持数据的完整性
3 隔离性:支持多个事务并发
4 永久性:事务之后数据的变化是永久性的
-- 索引 唯一索引 主键索引 组合索引 全文索引
-- 索引列应安排在where和on之后
-- %代表0个或是多个字符
-- 常用的函数
abs round()四舍五入
字符串函数:length() concat() insert()替换 left right substring 截取字符串 reverse 反转
日期函数:now systdate
聚合函数: max min count sum avg
流程函数:if() ifnull() case 分支判断
-- mysql中exists 和in的区别
select * from t1220 t1 where exists(select * from t1220 t2 where t2.id t1.id)
select * from t1220 where ParentId in(select ParentId from t1220 where ParentId <3)
exists只要是满足查询为true才会返回数据,
in是先执行子查询在运行主查询
-- 优化sql
1 没有索引加索引 where on order by
2 索引没有生效 where之后避免出现null判断, 用union 来代替or 避免like 避免in not in
3 分页显示
4 表结构优化
5 不使用数学运算