@q8517220
2019-08-23T13:36:24.000000Z
字数 8833
阅读 567
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 changed
mysql> 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 changed
mysql> 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> exit
Bye
[root@lwh ~]# mysql -uroot -p123456
mysql> use linuxfan;
Database changed
mysql> 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 |
+-----------------+--------+--------------------+--------+--------+