MySQL索引、事务、视图与存储过程

索引的概念

数据库中的索引与书籍中的目录类似

  • 在一本书中,无需阅读整本书,利用目录就可以快速查找所需信息
  • 书中的目录是一个词语列表,其中注明了包含各个词的页码

数据库索引

  • 在数据库中,索引使数据库程序无须对整个表进行描述,就可以在其中找到所需数据
  • 数据库中的索引是某个表中一列或者若干列值的集合,以及物理标识这些值的数据页的逻辑指针清单

索引的作用

  • 设置了合适的索引之后,数据库利用各种快速的定位技术,能够大大加快查询速率
  • 特别是当表很大时,或者查询涉及到多个表时,使用索引可使查询加快成千倍
  • 可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本
  • 通过创建唯一性索引保证数据表数据的唯一性
  • 可以加快表与表之间的连接
  • 在使用分组的排序时,可大大减少分组和排序时间

索引的分类

普通索引

  • 这是最基本的索引类型,而且它没有唯一性之类的限制

唯一性索引

  • 这种索引和前面的“普通索引”基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须唯一

主键

  • 主键是一种唯一索引,但它必须制定为"PRIMARY KEY"

全文索引

  • 在MySQL中,全文索引的索引类型为FULLTEXT,全文索引可以在VARCHAR或者TEXT类型的列上创建

单列索引与多列索引

  • 索引可以是单列上创建的索引,也可以是在多列上创建的索引

创建索引的原则依据

  • 表的主键、外键必须有索引
  • 数据量超过300行的表应该有索引
  • 经常与其他表进行连接的表,在连接字段上应该建立索引
  • 唯一性太差的字段不适合建立索引
  • 更新太频繁地字段不适合创建索引
  • 经常出现在Where子句中的字段,特别是大表的字段,应该建立索引
  • 索引应该建在选择性高的字段上
  • 索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引

创建索引的方法

根据企业需求选择了合适的索引之后,可使用CREATE INDEX创建索引
CREATE INDEX加上各个索引关键字便可创建各个类型的索引
创建普通索引
CREATE INDEX <索引的名字> ON tablename(列名)

mysql> create index index_name on info(name);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

创建唯一性索引
CREATE UNIQUE INDEX <索引的名字> ON tablename(列名)

mysql> create unique index unique_index_addr on info(addr);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

创建主键索引
(1)创建表的时候

CREATE TABLE tablename ([...],PRIMARY KEY (列名));

mysql> create table a (id int,primary key (id));
Query OK, 0 rows affected (0.02 sec)

(2)表已经存在的时候

ALTER TABLE tablename ADD PRIMARY KEY (列名);

mysql> alter table test add primary key(id);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

创建全局索引

mysql> create fulltext index full_addr on test01 (addr);
Query OK, 0 rows affected, 1 warning (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 1

创建组合索引

mysql> create index index_id_name on test01 (id,name);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

索引查看(使用两种方法结果一样)
SHOW INDEX FROM tablename
SHOW KEYS FROM tablename

mysql> show index from info;
+-------+------------+-------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name          | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+-------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| info  |          0 | PRIMARY           |            1 | id          | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
| info  |          0 | unique_index_addr |            1 | addr        | A         |           2 |     NULL | NULL   | YES  | BTREE      |         |               |
| info  |          1 | index_name        |            1 | name        | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+-------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
3 rows in set (0.00 sec)

mysql> show keys from info;
+-------+------------+-------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name          | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+-------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| info  |          0 | PRIMARY           |            1 | id          | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
| info  |          0 | unique_index_addr |            1 | addr        | A         |           2 |     NULL | NULL   | YES  | BTREE      |         |               |
| info  |          1 | index_name        |            1 | name        | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+-------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
3 rows in set (0.00 sec)

事物的概念

  • 事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行
  • 事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元
  • 适用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等等
  • 通过事务的整体性以保证数据的一致性

事物的ACID特点

原子性(Atomicity)

  • 事务是一个完整的操作,事务的各元素是不可分的(原子的)
  • 事务中的所有元素必须作为一个整体提交或回滚
  • 如果事务中的任何元素失败,则整个事务将失败

一致性(Consistency)

  • 当事务完成时,数据必须处于一致状态:
    在事务开始之前,数据库中存储的数据处于一致状态
    在正在进行的事务中,数据可能处于不一致的状态
    当事务成功完成时,数据必须再次回到已知的一致状态

隔离性(Isolation)

  • 对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务
  • 修改数据的事务可以在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据

持久性(Durability)

  • 事务持久性指不管系统是否发生故障,事务处理的结果都是永久的
  • 一旦事务被提交,事务的效果会被永久地保留在数据库中

事务的操作

默认情况相爱MySQL的事务是自动提交的,当sql语句提交时事务便自动提交
手动对事务进行控制的方法

  • 事务处理命令控制
  • 使用set设置事务处理方式

事务处理命令控制事务

  • begin:开始一个事务
  • commit:提交一个事务
  • rollback:回滚一个事务

提交事务操作

#输入begin命令,进入事务处理项,它是在内存上执行的
mysql> begin;
Query OK, 0 rows affected (0.01 sec)
#创建一条记录
mysql> insert into info (name,addr) values ('cheng','hz');
Query OK, 1 row affected (0.00 sec)
#提交事务
mysql> commit;
Query OK, 0 rows affected (0.01 sec)
#查看记录存在表中
mysql> select * from info;
+----+----------+------+
| id | name     | addr |
+----+----------+------+
|  1 | zhangsan | nj   |
|  2 | lisi     | bj   |
|  9 | cheng    | hz   |
+----+----------+------+
3 rows in set (0.00 sec)

回滚事务操作

#输入begin命令,进入事务处理项
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
#创建一条记录
mysql> insert into info (name,addr) values ('wangwu','nj');
Query OK, 1 row affected (0.00 sec)
#查看存在表上
mysql> select * from info;
+----+----------+------+
| id | name     | addr |
+----+----------+------+
|  1 | zhangsan | nj   |
|  2 | lisi     | bj   |
|  7 | wangwu   | nj   |
+----+----------+------+
3 rows in set (0.00 sec)
#存档
mysql> savepoint a;
Query OK, 0 rows affected (0.00 sec)
#再创建一条记录
mysql> insert into info (name,addr) values ('cheng','hz');
Query OK, 1 row affected (0.01 sec)
#查看存在表上
mysql> select * from info;
+----+----------+------+
| id | name     | addr |
+----+----------+------+
|  1 | zhangsan | nj   |
|  2 | lisi     | bj   |
|  7 | wangwu   | nj   |
|  8 | cheng    | hz   |
+----+----------+------+
4 rows in set (0.00 sec)
#执行回滚操作,回滚到存档 a
mysql> rollback to a;
Query OK, 0 rows affected (0.00 sec)
#查看数据表,上一条加的记录已被撤销
mysql> select * from info;
+----+----------+------+
| id | name     | addr |
+----+----------+------+
|  1 | zhangsan | nj   |
|  2 | lisi     | bj   |
|  7 | wangwu   | nj   |
+----+----------+------+
3 rows in set (0.00 sec)
#继续执行回滚操作,回滚到begin位置,此时事务处理结束,再次进行需要重新开始
mysql> rollback;
Query OK, 0 rows affected (0.02 sec)
#查看表记录均已被撤销
mysql> select * from info;
+----+----------+------+
| id | name     | addr |
+----+----------+------+
|  1 | zhangsan | nj   |
|  2 | lisi     | bj   |
+----+----------+------+
2 rows in set (0.00 sec)

使用set命令进行控制

  • setautocommit=0:禁止自动提交
  • setautocommit=1:开启自动提交

关闭自动提交

mysql> set autocommit=0;
Query OK, 0 rows affected (0.01 sec)
#创建一条记录
mysql> insert into info (name,addr) values ('xiaoming','nj');
Query OK, 1 row affected (0.00 sec)
#查看数据表
mysql> select * from info;
+----+----------+------+
| id | name     | addr |
+----+----------+------+
|  1 | zhangsan | nj   |
|  2 | lisi     | bj   |
|  9 | cheng    | hz   |
| 11 | xiaoming | nj   |
+----+----------+------+
4 rows in set (0.00 sec)
#保存
mysql> commit;
Query OK, 0 rows affected (0.02 sec)
#查看数据表
mysql> select * from info;
+----+----------+------+
| id | name     | addr |
+----+----------+------+
|  1 | zhangsan | nj   |
|  2 | lisi     | bj   |
|  9 | cheng    | hz   |
| 11 | xiaoming | nj   |
+----+----------+------+
4 rows in set (0.00 sec)

开启自动提交

mysql> set autocommit=1;
Query OK, 0 rows affected (0.00 sec)
#创建一条记录
mysql> insert into info (name,addr) values ('xiaohong','sz');
Query OK, 1 row affected (0.01 sec)
#查看数据表
mysql> select * from info;
+----+----------+------+
| id | name     | addr |
+----+----------+------+
|  1 | zhangsan | nj   |
|  2 | lisi     | bj   |
|  9 | cheng    | hz   |
| 11 | xiaoming | nj   |
| 12 | xiaohong | sz   |
+----+----------+------+
5 rows in set (0.00 sec)
#开启自动提交后是无法执行回滚操作的
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
#查看数据还在表中
mysql> select * from info;
+----+----------+------+
| id | name     | addr |
+----+----------+------+
|  1 | zhangsan | nj   |
|  2 | lisi     | bj   |
|  9 | cheng    | hz   |
| 11 | xiaoming | nj   |
| 12 | xiaohong | sz   |
+----+----------+------+
5 rows in set (0.00 sec)

视图

视图是一张虚拟的表,数据不存在视图中,真实表的映射数据,利用条件筛选、分组、排序等产生出一个结果集,并且做成持久化保存
视图能够方便友好的查询数据,基本不占用空间
真实数据变化,视图数据会同时变化
视图的作用:

  • 方便sql操作
  • 不通过权限用户的信息浏览
  • 安全

视图命令
create view 视图表名 查看命令

mysql> create view view_info as select id,name from info;
Query OK, 0 rows affected (0.02 sec)

mysql> select * from view_info;
+----+----------+
| id | name     |
+----+----------+
|  1 | zhangsan |
|  2 | lisi     |
|  9 | cheng    |
| 11 | xiaoming |
| 12 | xiaohong |
+----+----------+
5 rows in set (0.02 sec)

存储过程

存储过程多用于软件开发方向,防止代码在网络传输过程中被截获,做了安全性保障
原始状态:代码中需要嵌入sql语句,通过连接驱动,把sql语句作为参数传递给mysql(数据库)进行执行
存储过程是写在数据库中,并不是程序中
程序是通过调用存储过程名称去触发sql操作
优点:代码量优化,传输安全,网络优化

发布了74 篇原创文章 · 获赞 150 · 访问量 6506

猜你喜欢

转载自blog.csdn.net/weixin_45682995/article/details/103840740