1,myisam 和 innodb
什么是储存引擎?
数据库的储存引擎决定了表在计算机中的储存方式,不同的储存引擎有不同的储存机制,索引技巧等
储存引擎区别?
初步区分的话是这样的,
myisam表锁,不支持事物
innodb行锁,支持事物,innodb支持外键
补充说明:
myisam建表之后会有三个文件(一个是frm表结构文件,一个是myd数据文件,一个是myi索引文件),myisam索引结构文件与数据文件是分开的,另外它的索引是非聚簇(也就是二级索引)所以说myisam的索引都需要回一次表.
另外说明下,myisam索引文件存的是磁盘地址,过程是一次索引查询之后拿到磁盘地址(指针)。
innodb建表之后会有两个文件(一个是表结构文件frm,一个是索引与数据文件ibd)
2,索引
什么是索引
索引是数据库中对一列或者多列值进行排序的一种数据结构,使用索引能快速的访问到想要的数据。
索引都有哪些(mysql)
mysql索引大概有5中
主键索引
唯一索引
联合索引
全文索引
普通索引
mysql索引数据结构演化过程
二叉树-》红黑树-》btree-》b+tree
btree 和 b+tree的区别:
1,btree的关键字和记录是放在一起的,叶子接点可以看做外部节点,不包含任何信息;b+tree的非叶子节点中只有关键字和指向下一个节点的索引,记录只放在叶子节点中。
2,btree中,越靠近跟节点的记录查找时间越快,只要找到关键字即可确定记录的存在;而b+tree中每个记录的查找时间基本是一样的,都需要从根节点走到叶子节点,而且在叶子节点中还要再比较关键字。
联合索引遵循最左原则
举例:
一个表中有 id A B C D 5个字段。
现在建立联合索引 A B C
能用到ABC的情况:
select * from 表 A=? B=?C=?
select * from 表 A=? B=?C>?
select * from 表 A=? B=?C<?
select * from 表 B=? A=?C<?-查询优化器
能用到AB情况:
select * from 表 A=? B>?C=?
select * from 表 A=? B<?C>?
select * from 表 A=? B like ?C<?
select * from 表 A=? B between ?C<?
能用到A情况 与上面AB类似
3,回表
什么是回表?
所谓回表,是指mysql查询数据,拿到相关数据的主键(地址(指针))然后再进行一次查询查到相关具体数据,简而言之若想拿到具体信息就需要俩次查询。
聚簇索引&非聚簇索引
mysql底层数据储存用的是b+tree数据结构;
聚簇索引:叶子接点储存的是数据本身,所以聚簇索引不需要回表,一次就能查到整个真实数据。
非聚簇索引:叶子接点储存不是数据本身,是一个地址(指针)or 主键等数据
什么情况下需要回表?
情形1,myisam数据储存引擎级结构决定了它的查询都需要进行一次回表操作
情形2,覆盖索引不需要回表,
什么是覆盖索引,覆盖索引就是例如:就是将A B联合索引起来,然后查询 (主键)id A B就是覆盖索引
情形3,非覆盖索引,例如:建立联合索引 A B 然后查询的是 * 就都需要回表操作
开发的时候需要注意什么?
书写规范的sql语句。
尽量建立覆盖索引,然后查询数据
4,mysql三范式
第一范式,数据具有原子性,即每一列的数据都不能再拆分
第二范式,建立在第一范式的基础上,所以非主键字段都要依赖主键,而不能依赖主键的一部分
第三范式,建立在第二范式的基础上,非主键列只依赖主键,不依赖其他非主键
8,mysql日志
错误日志:
这种日志记录的内容包括服务器的启动和关闭,以及与问题或异常条件有关的消息。如果服务器无法启动,就可以查看此类日志。它会在终止之前把消息写到出错日志,以指明出现了什么问题。
普通查询日志:
这种日志记录的内容包括客户端连接、从客户端接收到的SQL语句和其他杂项事件。监视服务器的活动很有用处,从中可以了解到:'连接方是谁'、'它来之哪里',以及'它们在做什么'。当你想要查明客户端在往服务器发送什么样的语句时,使用日志是最方便的,它能为故障诊断或调试提供帮助。
慢查询日志:
这种日志可以帮你把那些可能需要被重新、以求或得更好性能的语句识别出来。默认情况下,如果某个查询花费的时间超过了10秒。它便会被认为很慢,并且服务器会将它写到慢查询日志里。有几个系统弄变量可以进一步控制慢查询日志所记录的内容。
二进制日志及二进制索引文件:
这种日志由一个或多个文件构成,记录由update、delete、insert、create table、drop table、grant等语句所做的修改。写到二进制日志里的内容都是一些以二进制格式编码的数据修改'事件'。二进制日志文件都伴随有一个索引文件,其中列出了当时存在的那些二进制日志文件。
用途:
1,在服务器崩溃之后,它可与备份一起配合完成表的恢复。首先,根据备份文件恢复数据库,然后,使用mysqlbinlog将二进制日志的内容转换为文本语句,并使用备份之后修改数据库的那些语句作为客户端mysql输入,把数据库恢复到崩溃时的状态。
2,它形成了复制的基础,储存在二进制日志里的数据修改事件可被传输到复制从服务器。
中继日志及中继日志索引文件
如果服务器是一个复制从服务器,它就会维护一个中继日志,其中包含的是从主服务器接收到的需要被执行的数据修改事件记录。中继日志文件的格式与二进制日志文件的格式相同,它有一个索引文件,其中列出的是从服务器上存在的日志文件。
redo日志 undo日志(innodb)