Linux—MySQL数据库索引与事务
一.数据库索引
1.概念:
索引是一种特殊的文件,包含着数据表中所有记录的引用指针。即数据库索引相当于一本书的目录,能够加快数据库的查询速度。数据库索引就是为了提高表的搜索效率而对某些字段的值建立起来的目录
2.作用:
1.设置了合适的索引之后,数据利用各种快速的定位技术,可以大大加快数据的查询速度,这是创建索引的最主要的原因
2.当表很大时,或者查询多个表时,使用索引的可以加快查询速度
3.索引也可以降低数据库的I/O成本,并且索引还可以降低数据库的排序成本
4.通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性
5.索引可以加快表与表之间的连接
6.在使用分组和排序子句进行数据查询时,可以显著减少查询中分组和排序的时间
3.分类:
普通索引
这是最基本的索引类型,而且它没有唯一性之类的限制
唯一性索引
这种索引和前面“普通索引”基本相同,但有一个区别:索引列的所有值只能出现一次,即必须唯一
主键索引
主键是一种唯一性索引,但是它必须指定为“primary key”。在数据库中表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型
全文索引
索引类型为 fulltext,全文索引可以在char、varchar 或者 text 类型的列上创建
单索引与多列索引
索引可以是单列上创建的索引,可以是在多列上创建的索引。而且多列索引可以区分其中一列可能相同值的行
4.创建索引的原则依据:
1.表的主键、外键必须有外键。主表中的外键一定是另一张表中的主键。
2.数据量超过300行的表应该有索引。
3.经常与其他数据表进行表连接的数据表,在连接字段上应该建立索引
4.唯一性太差的字段不合适建立索引
5.更新太频繁的字段不适合创建索引。
6.经常出现在Where语句的字段,应该建立索引
7.索引应该建在选择性高的字段上。
8.索引应该建立在小字段上,对于大的文本字段甚至超长字段,不要建立索引。
5.创建索引的方法:
先在创建数据库,再创建表:
mysql> create database school;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| school |
| sys |
+--------------------+
mysql> use school;
mysql> create table info (
-> id int(4) not null primary key auto_increment,
-> name varchar(10) not null,
-> address varchar(50) default 'nj',
-> age int(3) not null);
mysql> insert into info (name,address,age) values ('zhangsan','bj',20),('lisi','sh',22);
mysql> select * from info;
+----+----------+---------+-----+
| id | name | address | age |
+----+----------+---------+-----+
| 1 | zhangsan | bj | 20 |
| 2 | lisi | sh | 22 |
+----+----------+---------+-----+
创建普通索引:
mysql> create index index_age on info (age);
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 | 1 | index_age | 1 | age | A | 2 | NULL | NULL | | BTREE | | |
+-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
创建唯一性索引:
mysql> create unique index unique_name on info (name);
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_name | 1 | name | A | 2 | NULL | NULL | | BTREE | | |
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
创建主键索引
mysql> alter table info add unique index index_name (name);
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 | index_name | 1 | name | A | 2 | NULL | NULL | | BTREE | | |
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
全文索引:
mysql> create fulltext index fulltext_address on info (address);
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 | index_name | 1 | name | A | 2 | NULL | NULL | | BTREE | | |
| info | 1 | fulltext_address | 1 | address | NULL | 2 | NULL | NULL | YES | FULLTEXT | | |
+-------+------------+------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
删除索引:
mysql> drop index index_age on info;
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 | | |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
二.数据库事务
1.概念:
1.事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即一组数据库命令要么都执行,要么都不执行
2.事务一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元。
3.事务适用于用户同时操作数据库系统。
4.通过事务的整体性以保证数据的一致性。
2.事务的ACID特点:
1.原子性:
事务是一个完整的操作,各个元素是不可分的,即原子的。事务中的所有元素必须作为一个整体提交或者回滚。如果事务中的任何元素失败,则整个事务失败
2.一致性:
当事务完成时,数据必须处于一致性;在事务开始之前,数据库中存储的数据处于一致性;在事务进行中时,数据可能处于不一致的状态;当事务成功完成时,数据必须再次回到已知的一致状态。
3.隔离性:
在数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖或影响其他事务。
4.持久性:
指的是不管系统是否发生故障,事务处理的结果都是永久的。一旦事务被提交,事务的效果会被永久地保留在数据库中
3.事务的操作:
默认情况下,MySQL的事务是自动提交的,当sql语句提交时事务便自动提交
手动控制事务两种方法:
事务处理命令控制:
begin:开始一个事务
commit:提交一个事务
rollback:回滚一个事务
使用set设置事务的处理方式
set autocommit=0:禁止自动提交
set autocommit=1:开启自动提交