Mysql
MySQL索引
一. 索引类型
1. 普通索引
是最基本的索引,没任何特殊限制(比如:唯一,非空) 如果用Navicat创建就是如下操作:
2. 唯一索引
与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一
3. 主键索引
是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。一般是在建表的时候同时创建主键索引
4. 组合索引
多个字段联合创建的一个索引,只有遵循最左原则索引才会有作用
5. 全文索引
主要用来查找文本中的关键字,而不是直接与索引中的值相比较。fulltext索引跟其它索引大不相同,它更像是一个搜索引擎,而不是简单的where语句的参数匹配。
fulltext索引配合match against操作使用,而不是一般where语句加like。
它可以在create table,alter table ,create index使用,不过目前只有char、varchar,text 列上可以创建全文索引。
值得一提的是,在数据量较大时候,现将数据放入一个没有全局索引的表中,然后再用CREATE index创建fulltext索引,要比先为一张表建立fulltext然后再将数据写入的速度快很多
二. 索引原理
1. 基本概念
索引其实就是一种数据结构,没有那么神奇
Mysq我们常用的l引擎是InnoDB
,而InnoDB的索引数据结构是:B+Tree(B+树)索引和Hash索引
两种,默认
索引数据结构是B+树
上述意思不是说索引数据结构只有这两种,还有比如说,完全平衡二叉树,
B树,Hash,B+ 树等
2. 索引分析
Hash
Hash索引,索引所对应的数组下标是通过hash算法随即计算出来的,所以会引发hash冲突
上图我们对name
字段进行创建索引操作
我们执行下面一段sql
select * from user where name='张三'
可以直接对’张三’进行hash运算,获取他随机的数组下标,可以直接从索引中拿到数据,然后再根据id进行回表操作拿到整行的数据
如果执行下面这个sql
select * from user where name>'张三'
此时Hash索引就显得鸡肋了,因为他是无序的,他的特点就是可以快速的进行精准查询
,但是不支持模糊查询
平衡二叉树
图中的每一个节点实际上应该有四部分:
- 左指针,指向左子树
- 键值(key)
- 键值所对应数据的存储地址(data域中的值)
- 右指针,指向右子树
需注意:完全平衡二叉搜索树是有序的,简单的说就是 “左边的小于右边的”,假如我们现在来查找 ‘周瑜’ ,需要查找2次(第一次操作,第二次周瑜),比哈希表要多一次。而且由于完全平衡二叉搜索树是有序的,所以支持范围查找。
B 树
B+ 树
MySQL事务
一. 事务四大特性
- 原子性
事务开始执行后,事务中的的所有操作,要么全不做,要么全做完,不可能停留在事务操作的哪一步,如果出错事务会
回滚
事务开始执行的状态
- 一致性
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统运行中发生故障,有些事务尚未完成就被迫中断,这些未完成的事务对数据库所作的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是不一致的状态。比如A向B转账,不可能A扣了钱,B却没收到。(也可以理解为系统从一个正确的状态,迁移到另一个正确的状态)
- 隔离性
同一时间,只允许一个事务操作同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账
- 持久性
指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其执行结果有任何影响