赞
踩
索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现。 更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。
现在我们有一个student表 需要找到学号为8的学生信息
在没有索引的情况瞎,此时数据库查找过程类似于"顺序表"查找.
顺序表是在内存中进行查找的,内存访问的速度快,数据也不多,其速度也是可以的.
数据库顺序查找,数据库的数据是在磁盘上的,磁盘访问的速度慢,数据量很多,其速度就很慢.
索引就是为了避免数据库进行顺序查找,提高查找的效率
我们知道哈希表的查找效率是 O(1) 的,所以使用哈希表的话 查找一个数据就会非常的快,那为什么索引不用哈希表呢?
原因: 如果使用哈希表,只能处理相等的情况,无法处理 >
<
>=
等 情况.因为哈希表存储是没有顺序的.
我们知道二叉搜索树的 中序遍历结果是有序的.如果要查找 id<6 且 id>3
的数据.可以先找到 id =3
再找到 id = 6
然后中序遍历在找到 3~6之间的数据就可以了.相比于哈希表,二叉树能处理范围查找,那为什么不用二叉搜索树呢?
原因: 如果使用二叉搜索树,二叉树每个节点最多有2个叉,当数据量大时,树的高度就会较高,最终操作的效率也会非常低,而且二叉搜索树获取到中序遍历的效率也不是很高效O(N).这样效率很低,就跟普通查找效率差不多了.
不再是二叉搜索,而是N叉搜索,树的高度会降低,查询快
叶子节点,非叶子节点,都可以存储数据,且可以存储多个数据
通过中序遍历,可以访问树上所有节点
真实的索引是用的B+树.
要考虑对数据库表的某列或某几列创建索引,需要考虑以下几点:
满足以上条件时,考虑对表中的这些字段创建索引,以提高查询效率。
反之,如果非条件查询列,或经常做插入、修改操作,或磁盘空间不足时,不考虑创建索引。
创建主键约束( PRIMARY KEY)、唯一约束( UNIQUE)、外键约束( FOREIGN KEY)时,会自动创建对应列的索引。
show index from 表名;
示例:
create index 索引名 on 表名(字段名);
示例:
drop index 索引名 on 表名;
示例:
- 普通索引 : 允许被索引的数据列包含重复的值
- 唯一索引 : 可以保证数据记录的唯一性
- 主键索引 : 是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于唯一标识一条记录,使用关键字PRIMARY KEY来创建
- 联合索引 : 索引可以覆盖多个数据列,如像
INDEX(columnA,columnB)
索引- 全文索引 : 通过建立倒叙索引,可以极大的提升检索效率,解决判断字段是否包含的问题,是目前搜索引擎使用的一种关键技术,可以通过
ALTER TABLE table_name ADD FULLTEXT(column)
; 来创建全文索引
现有一个数据表,存储了一些人的银行账户,
现在有一个人A需要向B转账3000元.
此时就需要执行两个操作.
假如在执行操作1的时候,执行之后,网络出现错误,或 数据库挂了,A的钱少了B的钱没有增加,3000就凭空消失了?
解决方案: 使用事务来控制,保证以上两句SQL要么全部执行成功,要么全部执行失败
事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。
在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务.
事务的基本特性称为 “ACID”
原子性(atomicity,或称不可分割性): 事务中的若干操作,要么全部执行成功,要么就都不执行.(这里的不执行,并不是真的不执行,而是一旦中间的某个步骤执行出错,就把前面已经执行完毕的步骤回滚(rollback)回去.)
一致性(consistency): 在事务开始之前和事务结束以后,数据库的完整性没有被破坏。执行事务前后,数据始终处于一种合法的状态.(例如转账操作,减账户余额的时候,不能把账户减成负数)
隔离性(isolation,又称独立性): 数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
持久性(durability): 事务一旦执行完毕,此时对于数据的修改就是持久生效的(数据存到磁盘中就是持久的.存到内存中就是不持久的)
( 1) 开启事务: start transaction;
( 2) 执行多条SQL语句
( 3) 回滚或提交: rollback/commit;
说明: rollback即是全部失败, commit即是全部成功
测试表
drop table if exists accout;
create table accout(
id int primary key auto_increment,
name varchar(20) comment '账户名称',
money decimal(11,2) comment '金额'
);
insert into accout(name, money) values
('阿里巴巴', 5000),
('四十大盗', 1000);
操作截图:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。