目录
一.初识mysql
1.1数据库简介:
1. 数据库(DB 、DataBase)
2. 概念:数据仓库,**软件**,安装在操作系统(windows,linux,mac,…)之上!SQL,可以存储大量的数据。!
3. 作用:存储数据、管理数据
1.2数据库分类
关系型数据库:
- MySQL,Oracle、Sql server , DB2,SQLlite
- 通过表和表之间,行和列之间的关系进行数据的存储非关系型数据库(NoSQL)
Redis、MongDB
非关系型数据库,对象存储,通过对象的自身属性来决定。
1.3数据管理
1.insert
语法: insert into 表名([字段一], [字段二])values(‘值1’),(‘值2’)
2.update
语法: UPDATE 表名 set column_name = value where 条件
3.delete
语法: `delete from 表名 [where 条件]`
二.数据查询
2.1简单的查询
select id, name,age from student where id=1
2.2where字句
1.逻辑运算符
and , or , not
2.比较运算符
is null 如果操作符为null 结果为真
is not null 如果操作符为not null 结果为真
between ... and 在...之间
like "%ye" 模糊查询
in(q,d,v,f,b) 在这些值中的某一个
3.联表查询
Inner join 如果表中至少有一个匹配,就返回行
left join 即使左表中没有匹配,也会从左表中返回所有的值
right jion 即使右表中没有匹配,也会从右表中返回所有的值
4.分页和排序
排序: 升序ASC 降序 DESC
分页:limit(查询起始下标,pagesize)
5.group by 分组
三.函数
3.1数学运算函数
abs(-4) -取绝对值
ceil(3.6) --向上取整
floor(2.3) --向下取整
sing(-10) -- 判断一个数的符号 0-0 负数返回-1 正数返回1
3.2字符串函数
char_length(str) 返回字符串长度
concat(starttime,"") 拼接字符串
replace(studentname,'周','邹') 将学生姓周的改为邹
3.3时间跟日期函数
curdate() --获取当前日期
now() --获取当前日期
locatime() --当地时间
sysdate() --系统时间
year(now()) 获取年
month(now()) 获取月
day(now()) 获取日
3.4聚合函数
count() 计数
sum()求和
avg()平均
max()最大
min()最小
四.事务
4.1事务的简单介绍
事务是数据库操作的最小工作单元,是一组不可再分的逻辑工作单元。
.事务是逻辑上的⼀组操作,要么都执⾏,要么都不执⾏。
4.2事务的特性
1.原子性: 最小的工作单元,整个工作单元要么一起提交成功,要么全部失败回滚。
2.一致性:执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的。·
3.隔离性:并发访问数据库时,一个用户的事务不被其他用户所干扰。
4.持久性:一个事务提交后。它对数据库中数据的改变是持久的。
4.3事务并发带来的问题
1.脏读:当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,并且使用了这个数据。
因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是"脏数据",依据脏数据做的操作可能是不正确的。
2.丢失修改:指在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据,第一个事务修改的数据就丢失。
3.不可重复读(修改):指一个事务多次读取同一个数据,读取到不同的结果;
原因:在这个事务多次访问同一数据的过程中,另一个事务对这个数据做了修改,导致这个事务多次访问同一数据时,出现访问到不同数据的情况。
4.幻读(新增和删除):它发生在一个事务读取几行数据,接着另一个并发事务插入了一些数据。在随后的查询中第一个读取的事务发现多了一些不存在的记录。
4.4事务的隔离级别
1.读未提交:允许读取尚未提交的数据变更;可能导致:脏读,不可重复读,幻读.
2.读已提交:允许读取并发事务已经提交的数据;可以防止脏读,会发生不可重复读和幻读。
3.可重复读:在同一个事务中,多次读取同样的数据结果是一样的,解决不可重复读问题,但是还有可能发生幻读。
4.串行化:每个事务串行执行 ,解决所有问题
默认的隔离级别是可重复读。
五.存储引擎
5.1存储引擎简介
存储引擎规定数据表如何存储数据,如何为存储数据建立索引;如何支持更新查询等技术。
5.2mysql提供的存储引擎
1.InnoDB存储引擎
从mysql 5.5.8开始,InnoDB是默认存储引擎。InnoDB 存储引擎是 Mysql 数据库 OLTP ( Online Transaction Processing 在线事务处理 ) 应用最广范的。
六.索引
6.1索引简介
索引(index)是帮助MySQL高效获取数据的数据结构。
6.2索引的底层数据结构
MySQL的默认的存储引擎InnoDB采用的B+树的数据结构来存储索引,选择B+树的主要的原因是:
第一阶数更多,路径更短
第二个磁盘读写代价B+树更低,非叶子节点只存储指针,叶子阶段存储数据,
第三是B+树便于扫库和区间查询,叶子节点是一个双向链表
6.3B树和B+树的区别
第一:在B树中,非叶子节点和叶子节点都会存放数据,而B+树的所有的数据都会出现在叶子节点,在查询的时候,B+树查找效率更加稳定
第二:在进行范围查询的时候,B+树效率更高,因为B+树都在叶子节点存储,并且叶子节点是一个双向链表
6.4聚簇索引什么是非聚簇索引
6.5回表查询
其实跟刚才介绍的聚簇索引和非聚簇索引是有关系的,回表的意思就是通过二级索引找到对应的主键值,然后再通过主键值找到聚集索引中所对应的整行数据,这个过程就是回表
6.6 覆盖索引
覆盖索引是指select查询语句使用了索引,在返回的列,必须在索引中全部能够找到,如果我们使用id查询,它会直接走聚集索引查询,一次索引扫描,直接返回数据,性能高。
6.7索引创建原则有哪些
有一个大前提,就是表中的数据要超过10万以上,我们才会创建索引,并且添加索引的字段是查询比较频繁的字段,一般也是像作为查询条件,排序字段或分组的字段这些。
还有就是,我们通常创建索引的时候都是使用复合索引来创建,一条sql的返回值,尽量使用覆盖索引,如果字段的区分度不高的话,我们也会把它放在组合索引后面的字段。
如果某一个字段的内容较长,我们会考虑使用前缀索引来使用,当然并不是所有的字段都要添加索引,这个索引的数量也要控制,因为添加索引也会导致新增改的速度变慢。
6.8什么情况下索引会失效
索引在使用的时候没有遵循最左匹配法则,第二个是,模糊查询,如果%号在前面也会导致索引失效。如果在添加索引的字段上进行了运算操作或者类型转换也都会导致索引失效。
我们之前还遇到过一个就是,如果使用了复合索引,中间使用了范围查询,右边的条件索引也会失效
所以,通常情况下,想要判断出这条sql是否有索引失效的情况,可以使用explain执行计划来分析
七.sql调优
说sql优化的话,我们会从这几方面考虑,比如
建表的时候、使用索引、sql语句的编写、主从复制,读写分离,还有一个是如果量比较大的话,可以考虑分库分表
1.创建表的时候,你们是如何优化
在定义字段的时候需要结合字段的内容来选择合适的类型,如果是数值的话,像tinyint、int 、bigint这些类型,要根据实际情况选择。如果是字符串类型,也是结合存储的内容来选择char和varchar或者text类型
2.sql语句做了哪些优化