索引的概念
索引是一种特殊的文件,包含着对数据表中所有记录的引用指针。更通俗地说,数据库索引好比一本书前面的目录,能加快数据库的查询速度。例如需要遍历2000条数据,在没有索引的情况下,数据库会遍历全部2000条数据后选择符合条件的;而有了相应的索引之后,数据库会直接在索引中查找符合条件的选项。数据库索引就是为了提高表的搜索效率而对某些字段中的值建立的目录。
索引的作用
(1)快速定位,大大加快数据的查询速度;
(2)降低数据库的IO(输入/输出)成本,降低数据库的排序成本;
(3)通过创建唯一性索引,可以保证数据表中的每一行数据的唯一性;
(4)加快表和表之间的联系;
索引的分类
(1)普通索引,最基本的索引类型,没有唯一性之类的限制
(2)唯一索引,索引列的所有值只能出现一次,即必须唯一,可以有一个为空值
(3)主键索引,主键是一种唯一索引,但它必须指定为“PRIMARY KEY”,不可以为空值,在数据库中为表定义主键将自动创建主键索引,主键索引是唯一索引的特殊类型。该索引要求主键中的每一个值都唯一
(4)全文索引,索引类型为FULLTEXT,全文索引可以在CHAR,VARCHAR或者TEXT类型的列上创建
(5)多列索引。多列索引可以区分其中一列可能有相同值的行。例如:如果经常在同一查询中为姓和名两列设置查询条件,那么在这两列上创建索引将很有意义
创建索引的条件
数据条目大于2000条 否则和不使用索引没有多大区别
创建及查看索引
首先进入数据库school创建一个数据表info
id name score hobby
1 张三 90 游泳
2 李四 79 看书
2 王五 68 画画
(1)创建普通索引
查看索引:show index from info \G; 在命令后面加上“\G”,可以竖向显示索引的信息
命令格式:
create index 索引名 on 表名 (列名);
(2)创建唯一索引
命令格式:create unique index 索引名 on 表(列名);
举例:create unique index unique_id_index on info(id);
(3)创建主键索引,
创建主键索引有两种方式,一种是在创建表的同时创建主键,主键索引默认创建
另一种是已经创建了表,没有指定主键,然后修改表加入主键,主键索引会自动创建,
命令格式:alter table 表名 add primary key(列名);
(4)删除索引
命令格式:drop index 索引名 on 表名;
举例:
drop index name_index on info;
drop index unique_id_index on info;
(5)删除主键
命令格式:alter table 表名 drop primary key;
举例:alter table info drop primary key;
(6)修改表的结构
增加一列,举例:alter table info add column age int;
删除表中一列;alter table info drop column age;
修改列的内容;alter table infos change hobby hobname char(16);
(7)创建全文索引:create table infos (descript text,fulltext(descript));
(8)创建多列索引:只需要在创建索引时指定多列即可
create index mulit_index on info(name,score);
事务的概念
事务是一种机制,一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么执行,要么都不执行。事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元。事务适用于用户同时操作数据库系统的场景,如银行,保险公司及证券交易系统等。通过事务的整体性以保证数据的一致性。事务是保证了一组操作的平稳性和可预测性的技术。
事务的ACID特性
事务具体有四个特性:原子性;一致性;隔离性;持续性
(1)原子性:事务是一个完整的操作,各元素是不可分的,即原子的。事务中的所有元素必须作为一个整体提交或回滚。如果事务中的任何元素失败,则整个事务将失败
(2)一致性:当事务完成时,数据必须处于一致状态;在事务开始之前,数据库中存储的数据处于一致状态;在正在进行的事务中,数据可能处于不一致的状态;当事务成功完成时,数据必须再次回到一致的一致状态。
(3)隔离性:对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务。修改数据的事务可以在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据。
(4)持久性:指不管系统是否发生故障,事务处理的结果都是永久的。一旦事务被提交,事务的效果会被永久的保存在数据库中
使用事务命令控制事务
begin:表示开始一个事务,后面会有多条数据库操作语句执行
commit:表示提交一个事务,对应前面的begin操作,它们之间的数据库操作语句一起完成
rollback:表示回滚一个事务,在begin和commit之间,如果某一个数据库操作语句出现错误,执行rollback回滚,数据库回到begin之前的状态,也就是操作语句都不执行
(1)往数据表info中插入两条数据,它们在一个事务中提交
使用begin开始事务,然后执行了两条插入语句,最后用commit提交事务,此时两条数据插入到了数据表中,这两条语句是作为一个整体操作的
(2)如果使用begin开始事务,但不使用commit提交事务会出现什么情况
可以看到依然能查询出插入的数据,但这只是在当前开启的事务中可以看到,因为没有提交,它们并不是真正插入到了数据表中
现在退出mysql,再重新进入mysql进行查看,此时数据表中并没有之前插入的数据,说明使用begin开始事务,执行操作语句后,必须使用commit进行提交,否则数据是不能自动提交的。
(3)rollback回滚的使用,假设插入一条数据后,需要恢复到插入前的数据库状态,使用rollback执行回滚
可以看到,使用begin开始事务,然后执行了插入命令,查询表数据可以看到插入的数据,但是执行回滚命令后,先前插入的数据已经没有了。
(4)使用savepoint定义回滚点,rollback决定回滚到的位置
回滚到s1,第一条插入的数据可以查询出来,但是并没有提交,如果需要保存到数据库,使用commit命令提交
使用set 设置控制事务
Mysql默认是自动提交事务,也可以修改为不自动提交,使用set命令操作
set autocommit=0 禁止自动提交 等同于begin
set autocommit=1 开启自动提交
创建视图:数据库中的虚拟表
作用:一张表或者多张表中的数据给不同的用户提供访问
举例:
公司员工绩效工资考核表
工号 姓名 年龄 岗位 绩效 工资
1 tom 50 总裁 100万
2 jerry 42 总监 90 20万
3 chary 30 云计算工程师 80 12万
4 jack 24 云计算工程师 90 15万
员工不能看到全部的信息,创建普通员工可见的工资视图