一:MySQL 索引介绍

索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址。在数据十分庞大的时候,索引可以大大加快查询的速度。这是因为使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据。

1.1:索引概述

索引是对记录集的多个字段进行排序的方法。在一张表中为一个字段创建一个索引,将创建另外一个数据结构,包含字段数值以及指向相关记录的指针,然后对这个索引结构进行排序,允许在该数据上进行二分法排序。使用索引的副作用是需要额外的磁盘空间。

索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于C语言的链表通过指针指向数据记录的内存地址)。

使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据,因此能加快数据库的查询速度。

索引就好比是一本书的目录,可以根据目录中的页码快速找到所需的内容。

索引是表中一列或者若干列值排序的方法。

建立索引的目的是加快对表中记录的查找或排序。

1.2:索引作用

数据库利用各种各样的快速定位技术,能够大大提高查询效率。特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍。

优点:

设置了合适的索引之后,数据库利用各种快速定位技术,能够大大加快查询速度,这是创建索引的最主要的原因。

当表很大或查询涉及到多个表时,使用索引可以成千上万倍地提高查询速度。

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

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

可以加快表与表之间的连接。

在使用分组和排序时,可大大减少分组和排序的时间。

1.3:索引的分类

创建测试数据库和表

MySQL索引、事务_字段

(1)普通索引

普通索引是最基本的索引,它没有任何限制,也是大多数情况下用到的索引。它有以下几种创建方式:

直接创建索引:

MySQL索引、事务_字段_02

【例】

MySQL索引、事务_mysql_03

column是指定要创建索引的列名。

length是可选项。如果忽略length的值,则使用整个列的值作为索引。索引列的长度一个最大上限255个字节。

和length的含义,在下面创建索引的操作中意义相同。

修改表结构的方式添加索引:

MySQL索引、事务_数据_04

【例】

MySQL索引、事务_数据_05

50是为该字段定义的字符长度,只能比初始值小,不能比初始值大

创建表结构时,同时创建索引:

MySQL索引、事务_mysql_06

【例】:创建t2表,指定user_name列为普通索引:

MySQL索引、事务_mysql_07

查询创建的索引:

MySQL索引、事务_mysql_08

(2)唯一索引

唯一索引与普通索引类似,不同的就是:唯一索引的索引列的值必须唯一,但允许有空值(注意和主键不同)。如果是组合索引,则列值必须唯一。

创建唯一索引语法:

MySQL索引、事务_数据_09

【例】

MySQL索引、事务_数据_10

注:唯一索引必须加上单词”unique“。

修改表结构的时候添加唯一索引语法

MySQL索引、事务_mysql_11

【例】

MySQL索引、事务_mysql_12

创建表的时候同时创建唯一索引:

MySQL索引、事务_数据_13

【例】:创建一个t3表,在表中的id字段上使用UNIQUE关键字创建唯一索引。

MySQL索引、事务_数据_14

查询索引:

MySQL索引、事务_字段_15

(3)主键索引

主键索引是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。一般是在建表的时候同时创建主键索引

【例】:创建一个名为t4的表,将user_name作为主键索引:

MySQL索引、事务_mysql_16

MySQL索引、事务_字段_17


查询索引:

MySQL索引、事务_数据_18

(4)组合索引

在组合索引的创建中,有两种场景,即为单列索引和多列索引。具体操作如下所示:

在一个名为t5用户表中,有name、age、sex三个字段,分别分三次建立了index普通索引。那么在select * from t5 wherename='' and age='' and sex='';数据查询语句就会分别检索三条索引,但是效果未达到最优,这个时候就需要使用组合索引,如下所示:

MySQL索引、事务_字段_19

接着查询索引:

MySQL索引、事务_数据_20

在MySQL中有一个概念叫做最左原则,下面的select 语句的 where 条件是依次从左往右执行的。

MySQL索引、事务_字段_21

若使用的是组合索引index use(name,age,sex)。在查询中,name、age、sex的顺序必须如组合索引中一致排序,否则索引将不会生效。

(5)全文索引(FULLTEXT)

对于较大的数据集,将资料输入一个没有FULLTEXT索引表中,然后创建索引,其速度比把资料输入现有FULLTEXT索引的速度更快。生成全文索引是一个非常消耗时间、非常消耗硬盘空间的做法。

创建表的全文索引:

MySQL索引、事务_mysql_22

【例】:创建表t6,在表中的user_name段上建立全文索引,SQL语句如下:

MySQL索引、事务_mysql_23

MySQL索引、事务_mysql_24

1.4:创建索引的原则依据

创建索引的原则依据:

表的主键和外键必须有索引;

数据量超过300行;

经常与其他表进行连接的表,在连接字段上应该建立索引;

经常出现在where子句中的字段,特别是大表的字段,应该建立索引;

索引应该建立在选择性高的字段上;

索引应该建立在小字段上,对于大的文本字段甚至超长字段,不要建立索引;

唯一性太差的字段不适合建立索引;

更新太频繁的字段不适合创建索引。

1.5:查看索引

MySQL索引查询命令格式语法如下所示:

MySQL索引、事务_数据_25

以t6表为例,查看t6表的索引内容:

方法一:

MySQL索引、事务_字段_26

方法二:

MySQL索引、事务_数据_27

1.6:删除索引

索引在创建之后,是会占用一定的磁盘空间的,因此表内如果有不再使用的索引,从数据库性能方面考虑,最好是删除无用索引。索引的删除有如下两种方法。

MySQL索引、事务_字段_28

同样以t6表为例,删除t6表的索引:

MySQL索引、事务_mysql_29

二:MySQL事务

MySQL事务主要用于处理操作量大,复杂度高的数据。

在 MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务。

事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行。

事务用来管理insert、update、delete语句。

一般来说,事务是必须满足4个条件(ACID):原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(lsolation,又称独立性)、持久性(Durability)。

在MySQL命令行的默认设置下,事务都是自动提交的,即执行SQL语句后就会马上执行COMMIT操作。因此要显示地开启一个事务必须使用命令BEGIN或者START TRANSACTION,或者执行命令SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。

BEGIN或START TRANSACTION:显示地开启一个事务;

COMMIT:也可以使用COMMIT WORK,二者是等价的。COMMIT会提交事务,并使已对数据库进行的所有修改变为永久性。

ROLLBACK:也可以使用ROLLBACK,二者为等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;

MySQL事务处理主要有两种方法:

(1)用BEGIN,ROLLBACK,COMMIT来实现

BEGIN 开始一个事务

ROLLBACK 事务回滚

COMMIT 事务确认

(2)直接用SET来改变MySQL的自动提交模式

set autocommit=0 禁止自动提交

set autocommit=1 开启自动提交

在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。

mysql> SET AUTOCOMMIT=0;
mysql>use auth; 
mysql>CREATE TABLE kgc_transaction_test( id int(5)) engine=innodb;
mysql>select * from kgc_transaction_test; 
mysql>begin;     //开始事务 
mysql>insert into kgc_transaction_test value(1); 
mysql> insert into kgc_transaction_test value(2); 
mysql> commit;      //提交事务 
mysql>select * from kgc_transaction_test;
mysql>begin;     //开始事务 
mysql>insert into kgc_transaction_test values(3); 
mysql>rollback;     //回滚 mysql> select * from kgc_transaction_test;     //因为回滚所以数据没有插入