数据库索引

一、数据库索引概述;

二、数据库索引分类;

三、Mysql数据库管理索引;

四、数据库事务概述;

五、数据库事务特性;

六、Mysql数据库管理事务;

 

 

一、数据库索引概述;

概述:索引是一种特殊的文件,包含着对数据表中所有记录的引用指针,如书本的目录类似,能够加快数据库的查询速度,更高效率的管理数据库;

作用:设置合适的索引后,数据库利用各种定位设置,可以大大的增加数据的查询速度;

           当表很大时,或者查询涉及到多个表时,使用索引可以加快查询速度甚至上千倍;

         可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本;

           通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性;

缺点:增加了数据库的存储空间;

           在插入和修改数据的同时会增加更多的时间,因为索引也要一同变化;

依据:表的主键必须有索引,主键索引中的值时唯一的;

           数据量超过300行的表应该有索引,不然会眼中影响数据库的查询性能;

           唯一性太差的字段不适合建立索引,比如一列中的1000行都是同一个字段;

           经常与其他表进行交互的表,其连接列中必须设置索引;

           更新太过于频发的字段不建议设置为索引列;

           经常出现在sql语句中的where中,建议设置为索引列;

         索引建议设置在小字段上,较大的字段上不建议设置为索引;

         

二、数据库索引分类;

普通索引:最基本的索引,无唯一性之类的限制;

唯一性索引:索引列中的所有值只能出现一次,如身份证号码列;

主键索引:是一种唯一性夺银,在一个表中创建主键后,则自动创建主键索引;

单列索引和多列索引:可以为单列或者多列,列中可能有重复的值,例如表中的性别列;

 

三、Mysql数据库管理索引;

准备数据库和表:

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 表名;

 

四、数据库事务概述;

概述:事务是一种机制,一个操作序列,包含了一组数据库操作指令,并且将多个操作指令当作一个整体,一同向系统提交或者回滚的操作,事务保证了数据的一致性,如支付宝中转账的操作,转账的账户和收钱的账户,两个操作组成一个完整的事务;

 

五、数据库事务特性;

原子性:事务是一个完整的操作,数据必须处于一致的状态,事务中的操作,要么全部成功,要么全部失败,此特性就是原子性;

一致性:当事务执行完毕后,数据必须处于一致状态,在开始事务时数据保持一致状态,执行事务的过程中事务可以出现不一致的情况,事务完毕后,数据必须保证一致状态;

隔离性:多个事务之间互不依靠,互补影响,相对独立;

持久性:事务处理完毕后,在系统中发生的变化是永久性的,会永久的保留在数据库中;

 

六、Mysql数据库管理事务;

管理事务的三个命令:

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 |

+-----------------+--------+--------------------+--------+--------+

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值