在我学习数据库时,有两个概念是非常重要的,在面试中很有可能被问到:
就是索引和事务的概念。
一、索引
通俗理解一下,我们每本书都有一个目录,通过这个目录我们很快的可以找到自己需要的某一章节,那么在数据库中就有一个索引,索引可以帮我们快速的找到数据的位置,提高数据海量数据的查询效率。
索引概念:索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现。
索引的作用:
- 数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系。
- 索引所起的作用类似书籍目录,可用于快速定位、检索数据。
- 索引对于提高数据库的性能有很大的帮助。
-------------------那么索引越多越好吗????
并不是。我们来看一下索引的应用场景:
- 数据量较大,且经常对这些列进行条件查询。
- 该数据库表的插入操作,及对这些列的修改操作频率较低。
- 索引会占用额外的磁盘空间,会额外创建索引信息表。
不适用索引的场景如下:
- 对于插入、删除数据频率高的表,不适用索引
- 对于某列修改频率高的,该列不适用索引
接下来看一下索引的使用:
查看索引:
show index from 表名;
例如查看学生表已有的索引:show index from student;
创建索引:(我们在创建主键、外键、唯一键时,都会给 对应的字段添加索引)
create index 索引名 on 表名(字段名);
例如创建班级表中,name字段的索引:create index idx_classes_name on classes(name);
删除索引:
drop index 索引名 on 表名;
例如删除班级表中name字段的索引:drop index idx_classes_name on classes
二、事务
事务的概念:事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。(其实这个类似于我们所说的原子操作,一个操作要么不做,要么全部做完)
为什么要有事务:
比如小明给小红转钱,那么小明的账户上就要少1000,小红的账户上就要多1000,,但是若是中间发生了断点,网络不好的状况,有可能小明账户上的钱少了1000,但是小红账户上却没有多1000,这就造成了麻烦。所以要引出事务概念:
来创建一个表理解一下:
创建表:
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);
转账操作:
-- 小明账户减少2000
update accout set money=money-2000 where name = '小明';
-- 小红账户增加2000
update accout set money=money+2000 where name = '小红'
(1)在转钱之前开启事务:
start transaction;
(2)然后进行转钱操作。
(3)操作完成后,要么提交,要么回滚。
提交事务:(事务提交就证明成功)
commit;
回滚事务:(事务回滚就会失败)
rollback;