@q8517220
2019-08-23T13:36:24.000000Z
字数 8833
阅读 637
mysql
一、数据库索引概述;
二、数据库索引分类;
三、Mysql数据库管理索引;
四、数据库事务概述;
五、数据库事务特性;
六、Mysqk数据库管理事务;
概述:索引是一种特殊的文件,包含着对数据表中所有记录的引用指针,如书本的目录类似,能够加快数据库的查询速度,更高效率的管理数据库;
作用:设置合适的索引后,数据库利用各种定位设置,可以大大的增加数据的查询速度;
当表很大时,或者查询涉及到多个表时,使用索引可以加快查询速度甚至上千倍;
可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本;
通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性;
缺点:增加了数据库的存储空间;
在插入和修改数据的同时会增加更多的时间,因为索引也要一同变化;
依据:表的主键必须有索引,主键索引中的值时唯一的;
数据量超过300行的表应该有索引,不然会眼中影响数据库的查询性能;
唯一性太差的字段不适合建立索引,比如一列中的1000行都是同一个字段;
经常与其他表进行交互的表,其连接列中必须设置索引;
更新太过于频发的字段不建议设置为索引列;
经常出现在sql语句中的where中,建议设置为索引列;
索引建议设置在小字段上,较大的字段上不建议设置为索引;
普通索引:最基本的索引,无唯一性之类的限制;
唯一性索引:索引列中的所有值只能出现一次,如身份证号码列;
主键索引:是一种唯一性夺银,在一个表中创建主键后,则自动创建主键索引;
单列索引和多列索引:可以为单列或者多列,列中可能有重复的值,例如表中的性别列;
准备数据库和表:mysql> create database linuxfan;Query OK, 1 row affected (0.01 sec)mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || linuxfan || mysql || performance_schema || sys |+--------------------+mysql> use linuxfan;Database changedmysql> create table it(岗位 char(16),姓名 char(16),身份证号 char(48),学历 char(16),工资 int);Query OK, 0 rows affected (0.00 sec)mysql> insert into it values('网络工程师','张三','150404199201091132','高中','5500');Query OK, 1 row affected (0.00 sec)mysql> insert into it values('网络工程师','李四','150406187805271432','专科','12000');Query OK, 1 row affected (0.00 sec)mysql> insert into it values('java工程师','王五','111376199609101456','初中','10000');Query OK, 1 row affected (0.00 sec)mysql> insert into it values('网络工程师','刘备','345646199209103256','高中','15000');Query OK, 1 row affected (0.00 sec)mysql> insert into it values('ui工程师','关羽','178645199909101189','本科','7000');Query OK, 1 row affected (0.00 sec)mysql> select * from it;+-----------------+--------+--------------------+--------+--------+| 岗位 | 姓名 | 身份证号 | 学历 | 工资 |+-----------------+--------+--------------------+--------+--------+| 网络工程师 | 张三 | 150404199201091132 | 高中 | 5500 || 网络工程师 | 李四 | 150406187805271432 | 专科 | 12000 || java工程师 | 王五 | 111376199609101456 | 初中 | 10000 || 网络工程师 | 刘备 | 345646199209103256 | 高中 | 15000 || ui工程师 | 关羽 | 178645199909101189 | 本科 | 7000 |+-----------------+--------+--------------------+--------+--------+普通索引语法:create index 索引名称 on 表名(列名);mysql> create index putong on it(工资);Query OK, 5 rows affected (0.00 sec)mysql> show index from it;+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+| it | 1 | putong | 1 | 工资 | A | NULL | NULL | NULL | YES | BTREE | | |唯一性索引语法:create unique index 索引名称 on 表名(列名);mysql> create unique index weiyi on it(身份证号);Query OK, 5 rows affected (0.00 sec)mysql> show index from it;+-------+------------+----------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |+-------+------------+----------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+| it | 0 | weiyi | 1 | 身份证号 | A | NULL | NULL | NULL | YES | BTREE | | || it | 1 | putong | 1 | 工资 | A | NULL | NULL | NULL | YES | BTREE | | |+-------+------------+----------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+mysql> insert into it values('网络工程师','张飞','150404199201091132','小学','7800');ERROR 1062 (23000): Duplicate entry '150404199201091132' for key 'weiyi'mysql> select * from it;+-----------------+--------+--------------------+--------+--------+| 岗位 | 姓名 | 身份证号 | 学历 | 工资 |+-----------------+--------+--------------------+--------+--------+| 网络工程师 | 张三 | 150404199201091132 | 高中 | 5500 || 网络工程师 | 李四 | 150406187805271432 | 专科 | 12000 || java工程师 | 王五 | 111376199609101456 | 初中 | 10000 || 网络工程师 | 刘备 | 345646199209103256 | 高中 | 15000 || ui工程师 | 关羽 | 178645199909101189 | 本科 | 7000 |+-----------------+--------+--------------------+--------+--------+创建主键:create table 表名 (字段一,字段二,primary key(列名));mysql> create table it2 (name char(16),id int,PRIMARY KEY (name));Query OK, 0 rows affected (0.01 sec)多列索引:create index 索引名称 on 表名(列名一,列名二);mysql> create index duolie on it(工资,学历);Query OK, 5 rows affected (0.01 sec)mysql> show index from it;+-------+------------+----------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |+-------+------------+----------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+| it | 0 | weiyi | 1 | 身份证号 | A | NULL | NULL | NULL | YES | BTREE | | || it | 1 | putong | 1 | 工资 | A | NULL | NULL | NULL | YES | BTREE | | || it | 1 | duolie | 1 | 工资 | A | NULL | NULL | NULL | YES | BTREE | | || it | 1 | duolie | 2 | 学历 | A | NULL | NULL | NULL | YES | BTREE | | |+-------+------------+----------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
查看索引:show index from 表名;
概述:事务是一种机制,一个操作序列,包含了一组数据库操作指令,并且将多个操作指令当作一个整体,一同向系统提交或者回滚的操作,事务保证了数据的一致性,如支付宝中转账的操作,转账的账户和收钱的账户,两个操作组成一个完整的事务;
原子性:事务是一个完整的操作,数据必须处于一致的状态,事务中的操作,要么全部成功,要么全部失败,此特性就是原子性;
一致性:当事务执行完毕后,数据必须处于一致状态,在开始事务时数据保持一致状态,执行事务的过程中事务可以出现不一致的情况,事务完毕后,数据必须保证一致状态;
隔离性:多个事务之间互不依靠,互补影响,相对独立;
持久性:事务处理完毕后,在系统中发生的变化是永久性的,会永久的保留在数据库中;
管理事务的三个命令:
begin:开始事务,后边有多条数据库操作语句开始执行;
commit:开始提交一个事务,对应前边的begin操作,将事务处理的结果保存到数据文件中;
rollback:开始回滚一个事务,在begin和commit之间,将事务中的全部语句撤回,恢复到执行begin之前的数据状态;
管理事务:mysql> use linuxfan;Database changedmysql> show table status where name="it"; ##确保it表存储引擎为InnoDB,如若不是按以下命令修改;mysql> alter table it engine=InnoDB;mysql> select * from it;+-----------------+--------+--------------------+--------+--------+| 岗位 | 姓名 | 身份证号 | 学历 | 工资 |+-----------------+--------+--------------------+--------+--------+| 网络工程师 | 张三 | 150404199201091132 | 高中 | 5500 || 网络工程师 | 李四 | 150406187805271432 | 专科 | 12000 || java工程师 | 王五 | 111376199609101456 | 初中 | 10000 || 网络工程师 | 刘备 | 345646199209103256 | 高中 | 15000 || ui工程师 | 关羽 | 178645199909101189 | 本科 | 7000 |+-----------------+--------+--------------------+--------+--------+mysql> begin; ##开始事务Query OK, 0 rows affected (0.00 sec)mysql> insert into it values('php工程师','曹操','891878195409081198','本科','9000');Query OK, 1 row affected (0.00 sec)mysql> commit; ##提交事务Query OK, 0 rows affected (0.00 sec)mysql> select * from it;+-----------------+--------+--------------------+--------+--------+| 岗位 | 姓名 | 身份证号 | 学历 | 工资 |+-----------------+--------+--------------------+--------+--------+| 网络工程师 | 张三 | 150404199201091132 | 高中 | 5500 || 网络工程师 | 李四 | 150406187805271432 | 专科 | 12000 || java工程师 | 王五 | 111376199609101456 | 初中 | 10000 || 网络工程师 | 刘备 | 345646199209103256 | 高中 | 15000 || ui工程师 | 关羽 | 178645199909101189 | 本科 | 7000 || php工程师 | 曹操 | 891878195409081198 | 本科 | 9000 |+-----------------+--------+--------------------+--------+--------+6 rows in set (0.00 sec)mysql> begin; ##开始事务Query OK, 0 rows affected (0.00 sec)mysql> insert into it values('php工程师','赵云','987867199012081198','专科','9500');Query OK, 1 row affected (0.00 sec)mysql> select * from it; ##未手动提交事务,但仍然能够看到数据,因为在当前已经开启的事务中可以看见,退出连接后,则自动提交事务+-----------------+--------+--------------------+--------+--------+| 岗位 | 姓名 | 身份证号 | 学历 | 工资 |+-----------------+--------+--------------------+--------+--------+| 网络工程师 | 张三 | 150404199201091132 | 高中 | 5500 || 网络工程师 | 李四 | 150406187805271432 | 专科 | 12000 || java工程师 | 王五 | 111376199609101456 | 初中 | 10000 || 网络工程师 | 刘备 | 345646199209103256 | 高中 | 15000 || ui工程师 | 关羽 | 178645199909101189 | 本科 | 7000 || php工程师 | 曹操 | 891878195409081198 | 本科 | 9000 || php工程师 | 赵云 | 987867199012081198 | 专科 | 9500 |+-----------------+--------+--------------------+--------+--------+mysql> exitBye[root@lwh ~]# mysql -uroot -p123456mysql> use linuxfan;Database changedmysql> select * from it;+-----------------+--------+--------------------+--------+--------+| 岗位 | 姓名 | 身份证号 | 学历 | 工资 |+-----------------+--------+--------------------+--------+--------+| 网络工程师 | 张三 | 150404199201091132 | 高中 | 5500 || 网络工程师 | 李四 | 150406187805271432 | 专科 | 12000 || java工程师 | 王五 | 111376199609101456 | 初中 | 10000 || 网络工程师 | 刘备 | 345646199209103256 | 高中 | 15000 || ui工程师 | 关羽 | 178645199909101189 | 本科 | 7000 || php工程师 | 曹操 | 891878195409081198 | 本科 | 9000 || php工程师 | 赵云 | 987867199012081198 | 专科 | 9500 |+-----------------+--------+--------------------+--------+--------+mysql> set autocommit = 0; ##设置禁用自动提交事务Query OK, 0 rows affected (0.00 sec)mysql> begin; ##开始事务Query OK, 0 rows affected (0.00 sec)mysql> insert into it values('nginx工程师','诸葛亮','187967198712081198','专科','6700');Query OK, 1 row affected (0.00 sec)mysql> rollback; ##回滚事务Query OK, 0 rows affected (0.00 sec)mysql> select * from it; ##查询已经无数据记录+-----------------+--------+--------------------+--------+--------+| 岗位 | 姓名 | 身份证号 | 学历 | 工资 |+-----------------+--------+--------------------+--------+--------+| 网络工程师 | 张三 | 150404199201091132 | 高中 | 5500 || 网络工程师 | 李四 | 150406187805271432 | 专科 | 12000 || java工程师 | 王五 | 111376199609101456 | 初中 | 10000 || 网络工程师 | 刘备 | 345646199209103256 | 高中 | 15000 || ui工程师 | 关羽 | 178645199909101189 | 本科 | 7000 || php工程师 | 曹操 | 891878195409081198 | 本科 | 9000 || php工程师 | 赵云 | 987867199012081198 | 专科 | 9500 |+-----------------+--------+--------------------+--------+--------+