数据库操纵语言:
DQL(Data Query Language):数据查询语言:Select
DCL(Data Controller Language):数据库控制语言,如rollback(回滚)
DML(Data Manipulation Language):数据库操作语言: 如 update delete 主要是对表里面数据的一个增删改
DDL(Data Definition Language):数据定义语言,主要是操作创建表,删除表,Create Drop
1.为什么设计索引
因为数据量太大,需要设计类似于字典查询目录的结构,来加快查询速率
会单独出一个索引文件
2.如何设计索引
关键值:key
文件名称
偏移量:offset
3.索引采用哪种数据结构
mysql采用B+树数据结构
为什么mysql采用b+数据结构
跟哈希数据结构相比:哈希虽然查询速率快,但是哈希无法将数据按照顺序排列起来,这样就造成了哈希在等值查询时速率高,但是在范围查询时速率低
跟二叉树比起来:随着数据量过大,二叉树的深度会过深,太深的树结构会导致磁盘的IO次数过多,降低效率
b树与b+树都是多叉树,度的概念,一个节点能最大容纳的数据量叫度
跟B树比起来:B+树的只有叶子节点会存储数据,同时叶子节点直接互相连接了起来,这样b+树只需要三层的深度就可以保存大量的数据,相比起来B树每个节点都会带数据,那么同样的深度b树做数据结构的索引,能够表示的数据量就会很少。
同时增删节点效率更高,同时b+树的叶子节点中会包含所有的数据,因为b+树的叶子节点都是有序的链表结构存储,这样它的增删效率
同时因为B+树的结构(b+树的叶子节点中会包含所有的数据,所有叶子节点互相连接),
因此他有两种查找方式,
一种是,从根节点开始的随机查找
一种是,一种是从叶子节点的范围查找和分页查找
索引b+树里面的key值要么为主键,要么为唯一键,要么为自生成的row_id
innodb和myisam索引的区别
同样都是以B+树为数据结构
innodb是数据直接放在索引里,索引文件后缀ibd
myISAM是索引里存放的是数据的地址 索引文件后缀MYI,数据MYD
innodb支持事务
MyISAM不支持事务
什么是聚簇索引和什么是非聚簇索引
聚簇索引,数据和索引放在一起的
非聚簇索引,数据和索引是分开放的
回表
如果创建索引的键是其他字段,那么叶子节点里存储的就是该记录的主键,获取该主键后,再通过主键索引找到对应的记录,这就是回表,相当于要查两颗b+树
举例:
如以下表,有id和name两个字段
当用以name字段来作为索引,会形成以下的b+树
当执行以下命令时候
select * from table where name = teacher.ma
他会现遍历name的B+树找到对应的主键值
再通过以下的主键索引b+树找到真正的数据值
索引覆盖
接上面的回表
当使用以下查询命令时,只会查询一个索引的b+树
select id from table where name = teacher.ma
最左匹配
最左匹配,是和组合索引一起使用的
组合索引:几个字段一起作为索引
所以最左匹配是在组合索引的基础上
如组合索引,用两个字段作为索引,name,age
最左匹配就是在查询的时候,如果想使用(name,age)这个组合索引,要先匹配到最左端的name才能集合(name,age)这个组合索引
索引下推
前缀索引
当某些较长的字符串做索引时(如密码),选取字符串的前几位来作为索引
4.mysql是如何实现索引的
5.mysql索引另外一种数据结构是:哈希 存储引擎为Memory
不同的存储引擎,底层索引实现有不同的数据结构
InnoDB 和 MyISAM 索引的底层数据结构为B+树
MEMORY 引擎底层的数据结构为 HASH
MySQL的事务隔离级别
首先要明确Mysql事务隔离级别要实际解决的问题
主要有以下待解决的问题
基本的sql语句
增:
insert into
insert into table(列1,列2) values(值1,值2)
删: (是删除表中的某一行)
delete
delete from table where 列 = '值'
改:
update…set
update table set 列=新值 where 列 = 值
查:
select
select 字段名 from where 字段名 = 值
模糊查询
练习各种sql查询语句
三个表 dept(部门表) dname(员工姓名) salgrade(工资等级)
1.查询员工的年薪
tip:薪水乘以12
SELECT
ename,
sal * 12 AS `annule sal`
FROM
emp;
2.查询员工总收入
tip:薪水乘以12+津贴
注意津贴是有空值(null)的,null也要参与计算,所有对于有空值的列要注意
SELECT
ename,
sal * 12 AS `annule sal`
FROM
emp;