MySQL索引与事务详解

MySQL索引与事务详解

一、前言

? 上一章我们讲解了MySQL的手工编译安装流程以及相关的数据库操作命令(sql语句),本文将要详细介绍MySQL索引与事务的概念及原理,并初步了解MySQL数据库视图概念,简述数据库的存储过程。

二、索引

2.1索引的概念——什么是索引?

? 一般来说,一篇论文,或者说一本书,都有其目录,而目录一般是所有章节的概述,或者说是要点核心,而索引的概念其实也与之类似。

? 索引,顾名思义,就是一个方便用户搜索所需资源的引导,只不过在数据库中,索引一般被认为是一种特殊的文件,尤其在Linux系统中("一切皆文件")。从专业术语上解释其含义就是“代表记录的引用指针”。

2.2索引的作用

  • 加快查询速度,提高工作效率;
  • 降低i/o成本,提供基础排序;
  • 加快多表之间的连接;
  • 支持唯一性索引(下面会介绍什么是唯一性索引),保证数据表中数据的唯一性性;

2.3索引的分类

2.3.1普通索引

? 就是一般的索引,只是为了区别于其他特殊索引的一个统称

2.3.2唯一性索引

? 与普通索引基本类同,区别在于,唯一性索引的列中的所有值都不相同,即“唯一”。

? 简单举例来说,学生数据表,年龄可以是普通索引,但不可以是唯一性索引,但是详细住址可以是。

2.3.3主键索引

? 本质上也是一种唯一性索引,但必须指定为“primary key”,该索引要求主键中的每个值都唯一。上篇文章中,我们提及到了主键的概念,其特点也是“非空唯一”。

2.3.4全文索引

? 索引类型为FULLTEXT,全文索引可以在char、vachar或者text类型的列上创建。

2.3.5单列索引与多列索引

? 可以在单列或多列上创建索引。多列索引一般用于区分其中一列可能有相同值的行。

2.4创建索引的原则:建立在表上的(索引依赖于表)

? 索引可以提升数据库的查询速度,但并非所有的数据表都需要创建索引。因为索引本身也是需要占用系统资源的,或许一般情况下这个问题不会很突出,因为服务器的资源在一定程度上还是能够正常支持的,但是如果索引文件过大,其大小可能达到操作系统允许的最大文件限制。

? 并且,如果说索引使用不当也会造成数据库的负担。因此,数据库创建索引也是有其原则的。

2.4.1创建索引的原则依据

  1. 表的主键、外键必须有索引;
  2. 达到一定量的表(300行记录)应该有索引;
  3. 表之间的连接字段上应该建立索引;
  4. 不能使用唯一性太差的字段作为索引;
  5. 更新频繁的字段也不适合作为索引;
  6. 小字段适合建立索引,长的字段则不适合建立索引;

2.5索引的优缺点

优点:快速查询所需资源

缺点:占用空间以及资源

2.6创建及查看索引

首先我们需要保证数据库中有表,且表内有数据;

mysql> select * from fruit_info;
+----+-------+---------+
| id | price | newtype |
+----+-------+---------+
|  1 |  2.50 | banana  |
|  2 |  5.50 | apple   |
|  3 |  6.00 | peach   |
+----+-------+---------+
3 rows in set (0.00 sec)

2.6.1创建普通索引

命令格式:create index <索引名> on 数据表 (列名);

实例:

mysql> create index id_index on fruit_info(id);
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> show index from fruit_info;  #查看索引语句也可以将index换成“keys”
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table      | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| fruit_info |          1 | id_index |            1 | id          | A         |           3 |     NULL | NULL   |      | BTREE      |         |               |
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.00 sec)

其中Non_unique为1,表示不是唯一性索引;Key_name 对应的是索引名称,这里就是id_index;

2.6.2创建唯一性索引

命令格式:create unique index <索引名称> on 数据表 (列名);

实例:

mysql> create unique index type_index on fruit_info(newtype);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from fruit_info;
+------------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table      | Non_unique | Key_name   | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+------------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| fruit_info |          0 | type_index |            1 | newtype     | A         |           3 |     NULL | NULL   | YES  | BTREE      |         |               |
| fruit_info |          1 | id_index   |            1 | id          | A         |           3 |     NULL | NULL   |      | BTREE      |         |               |
+------------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.00 sec)

这里的索引名称为type_index,与之对应的Non_unique的值为0,表示其为唯一性索引。并且唯一性索引的值都不一样。

那么我们考虑一个问题:数据库中的表的字段是否既可以是普通索引,又可以是唯一性索引?

我们来实操验证一下:

mysql> create unique index id_index_new on fruit_info(id);
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from fruit_info;
+------------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table      | Non_unique | Key_name     | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+------------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| fruit_info |          0 | id_index_new |            1 | id          | A         |           3 |     NULL | NULL   |      | BTREE      |         |               |
| fruit_info |          0 | type_index   |            1 | newtype     | A         |           3 |     NULL | NULL   | YES  | BTREE      |         |               |
| fruit_info |          1 | id_index     |            1 | id          | A         |           3 |     NULL | NULL   |      | BTREE      |         |               |
+------------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
3 rows in set (0.00 sec)

事实证明是可以的,但是我们需要知道唯一性索引与普通索引的区别就在于“唯一性”上。如果创建了唯一性索引,那么在插入数据记录的时候就需要注意字段匹配时的唯一性。

2.6.3创建主键索引

命令格式:(1)创建表的时候创建主键:create table 表名 ([ ... ],primary key(列的列表));

(2)修改表结构加入主键:alter table 表名 add primary key;

实例:

mysql> create table student (id int not null,sex char(2),age int not null,hobby varchar(20),primary key(id,hobby));
Query OK, 0 rows affected (0.01 sec)

mysql> show index from student;
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table   | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| student |          0 | PRIMARY  |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| student |          0 | PRIMARY  |            2 | hobby       | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.01 sec)

一个表里面只能有一个主键,但一个主键可以由多个字段组成。

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

mysql> show index from fruit_info;
+------------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table      | Non_unique | Key_name     | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+------------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| fruit_info |          0 | PRIMARY      |            1 | id          | A         |           4 |     NULL | NULL   |      | BTREE      |         |               |
| fruit_info |          0 | id_index_new |            1 | id          | A         |           4 |     NULL | NULL   |      | BTREE      |         |               |
| fruit_info |          0 | type_index   |            1 | newtype     | A         |           4 |     NULL | NULL   | YES  | BTREE      |         |               |
| fruit_info |          1 | id_index     |            1 | id          | A         |           4 |     NULL | NULL   |      | BTREE      |         |               |
+------------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
4 rows in set (0.00 sec)

主键索引是设置主键后自动创建的,无需指定名称,系统自动生成名字“primary”。主键索引与唯一性索引区别就在于唯一性索引可以为null,而主键索引为not null,所以可以简单用公式理解:primary index = not null + unique index;

2.6.4全文索引

全文索引可以建立的字段类型在前面已经提及了,命令格式如下:

1、create table 表名 (列名 text,FULLTEXT(列名))engine=MyISAM;

2、alter table 表名 add FULLTEXT(列名);

实例:

查看数据库的存储引擎类型:(存储引擎我们下一篇文章会讲解)

mysql> show table status from fruit where name=‘student‘\G
*************************** 1. row ***************************
           Name: student
         Engine: InnoDB
        Version: 10
     Row_format: Dynamic
           Rows: 0
 Avg_row_length: 0
    Data_length: 16384
Max_data_length: 0
   Index_length: 16384
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2020-01-06 19:12:24
    Update_time: NULL
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options:
        Comment:
1 row in set (0.00 sec)
mysql> alter table student add fulltext(hobby);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

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

2.6.5多列索引

在创建索引时指定多列即可

命令格式:create index 索引名 on 表名(字段1,字段2);

实例:

mysql> create index mo_index on student(id,hobby)
    -> ;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from student;
+---------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table   | Non_unique | Key_name    | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| student |          0 | PRIMARY     |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| student |          0 | PRIMARY     |            2 | hobby       | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| student |          1 | mo_index    |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| student |          1 | mo_index    |            2 | hobby       | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| student |          1 | hobby       |            1 | hobby       | NULL      |           0 |     NULL | NULL   |      | FULLTEXT   |         |               |
+---------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
6 rows in set (0.00 sec)

2.7删除索引

命令格式:

2.7.1直接删除索引

格式:drop index 索引名 on 表名;

实例:

mysql> drop index mo_index on student;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from student;
+---------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table   | Non_unique | Key_name    | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| student |          0 | PRIMARY     |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| student |          0 | PRIMARY     |            2 | hobby       | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| student |          1 | hobby       |            1 | hobby       | NULL      |           0 |     NULL | NULL   |      | FULLTEXT   |         |               |
+---------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
4 rows in set (0.00 sec)

2.7.2修改表是删除索引

格式:alter table 表名 drop index 索引名;

实例:

mysql> alter table student drop index hobby;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

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

2.7.3删除主键索引

格式:alter table 表名 drop primary key;

实例:

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

mysql> show index from student;
Empty set (0.00 sec)

当然如果在修改表结构的时候,删除了包含索引的列,那么对应的索引也会被删除。

三、事务

3.1事务的概念

将多个命令作为整体执行,要么都成功要么都不执行,如银行转账;

如果执行事务的时候,前面的一部分成功了,而最后的一部分失败了,那么就会实行“回滚“机制,将执行操作回到事务的起点位置,数据没有发生结果性变化。

3.2事务的ACID特点(4个)

3.2.1原子性

? 事务是不可分割的工作逻辑单元,事务可以包含多个sql语句,但整个事务是一个完整的操作,不可分割;(比如转账,转账过程中一但出现error,那么就会回滚到起初状态,二者资产不会有任何变化)

3.2.2一致性

? 事务执行前和执行后数据必须处于一致状态,但是执行过程中是动态变化的;(比如转账,转账前和转账后双方资产的总和是不变的(不考虑手续费等其他费用的情况))

3.2.3隔离性

? 并发事务是彼此隔离的,事务之间必须是独立(比如打电话,甲和乙打电话不会影响丙和丁打电话)

3.2.4持久性

? 事务结果都是永久的并且是不可逆的(比如转账的结果,如果发生纠纷再次处理就是另一个事务了。)

3.3事务的操作

3.3.1自动提交

? 默认的情况下是自动提交的,就是输入了sql语句就自动提交执行该命令,但一般来说这是不安全的;

3.3.2手动提交

? 在生产环境中,该模式使用比较多,这是因为手动提交可以通过缓存,内存中的数据显示的结果查看是否出错,错了即实行回滚操作(rollback)(一般会设置回滚点)。

3.3.3使用事务命令控制事务(4个)

begin:表示开始一个事务,后面接多个sql语句;0

commit:表示提交一个事务,对应前面的begin

rollback:表示回滚一个事务,在begin和rollback之间,错误的时候可以回滚。

savepoint:表示设置回滚点配合rollback命令使用。

实例:

首先我们有一个如下的数据表:

mysql> desc fruit_info;   #表结构
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id      | int(4)       | NO   | PRI | NULL    |       |
| price   | decimal(3,2) | NO   |     | NULL    |       |
| newtype | varchar(6)   | YES  | UNI | NULL    |       |
+---------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> select * from fruit_info; #表数据
+----+-------+---------+
| id | price | newtype |
+----+-------+---------+
|  1 |  2.50 | banana  |
|  2 |  5.50 | apple   |
|  3 |  6.00 | peach   |
|  4 |  6.00 | orange  |
+----+-------+---------+
4 rows in set (0.00 sec)

mysql> begin; #开始一个事务的标志
Query OK, 0 rows affected (0.00 sec)

mysql> insert into fruit_info values(5,4,‘pear‘);  #插入一个记录
Query OK, 1 row affected (0.00 sec)

mysql> select * from fruit_info; #此时只是放入缓存中使用rollback可以回到最初状态;
+----+-------+---------+
| id | price | newtype |
+----+-------+---------+
|  1 |  2.50 | banana  |
|  2 |  5.50 | apple   |
|  3 |  6.00 | peach   |
|  4 |  6.00 | orange  |
|  5 |  4.00 | pear    |
+----+-------+---------+
5 rows in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from fruit_info;
+----+-------+---------+
| id | price | newtype |
+----+-------+---------+
|  1 |  2.50 | banana  |
|  2 |  5.50 | apple   |
|  3 |  6.00 | peach   |
|  4 |  6.00 | orange  |
+----+-------+---------+
4 rows in set (0.00 sec)

mysql> insert into fruit_info values(5,4,‘pear‘);
Query OK, 1 row affected (0.00 sec)

mysql> commit;  #提交之后无法使用rollback回到最初状态;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from fruit_info;
+----+-------+---------+
| id | price | newtype |
+----+-------+---------+
|  1 |  2.50 | banana  |
|  2 |  5.50 | apple   |
|  3 |  6.00 | peach   |
|  4 |  6.00 | orange  |
|  5 |  4.00 | pear    |
+----+-------+---------+
5 rows in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from fruit_info;
+----+-------+---------+
| id | price | newtype |
+----+-------+---------+
|  1 |  2.50 | banana  |
|  2 |  5.50 | apple   |
|  3 |  6.00 | peach   |
|  4 |  6.00 | orange  |
|  5 |  4.00 | pear    |
+----+-------+---------+
5 rows in set (0.01 sec)

设置断点——“回滚点”

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into fruit_info values(5,4,‘pear‘);
ERROR 1062 (23000): Duplicate entry ‘5‘ for key ‘PRIMARY‘
mysql> insert into fruit_info values(6,4,‘grape‘);
Query OK, 1 row affected (0.00 sec)

mysql> savepoint s1;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into fruit_info values(7,4,‘cherry‘);
Query OK, 1 row affected (0.00 sec)

mysql> savepoint s2;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from fruit_info;
+----+-------+---------+
| id | price | newtype |
+----+-------+---------+
|  1 |  2.50 | banana  |
|  2 |  5.50 | apple   |
|  3 |  6.00 | peach   |
|  4 |  6.00 | orange  |
|  5 |  4.00 | pear    |
|  6 |  4.00 | grape   |
|  7 |  4.00 | cherry  |
+----+-------+---------+
7 rows in set (0.00 sec)

mysql> rollback to savepoint s2;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from fruit_info;
+----+-------+---------+
| id | price | newtype |
+----+-------+---------+
|  1 |  2.50 | banana  |
|  2 |  5.50 | apple   |
|  3 |  6.00 | peach   |
|  4 |  6.00 | orange  |
|  5 |  4.00 | pear    |
|  6 |  4.00 | grape   |
|  7 |  4.00 | cherry  |
+----+-------+---------+
7 rows in set (0.00 sec)

mysql> rollback to savepoint s1;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from fruit_info;
+----+-------+---------+
| id | price | newtype |
+----+-------+---------+
|  1 |  2.50 | banana  |
|  2 |  5.50 | apple   |
|  3 |  6.00 | peach   |
|  4 |  6.00 | orange  |
|  5 |  4.00 | pear    |
|  6 |  4.00 | grape   |
+----+-------+---------+
6 rows in set (0.00 sec)
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from fruit_info;
+----+-------+---------+
| id | price | newtype |
+----+-------+---------+
|  1 |  2.50 | banana  |
|  2 |  5.50 | apple   |
|  3 |  6.00 | peach   |
|  4 |  6.00 | orange  |
|  5 |  4.00 | pear    |
+----+-------+---------+
5 rows in set (0.00 sec)

mysql> rollback to savepoint s1;
ERROR 1305 (42000): SAVEPOINT s1 does not exist

根据以上的结果我们可以得到如下结论:

使用事务命令控制事务是可以实现回滚机制的;

在使用savepoint结合rollback命令时,回滚的位置是根据你执行的命令的最终位置;

如果直接使用rollback命令是直接回到最初状态,且无法回到其他回滚节点。

3.3.4set命令

set autocommit=0:禁止自动提交 ——就相当于begin;

set autocommit-=1:开启自动提交

四、总结

? 本文主要是对MySQL数据库中的索引和事务的概念进行详细的介绍,这里的概念和原理以及对应的使用场景需要我们结合实例进行详细理解。索引的分类以及主键索引与唯一性索引的区别,事务的4大特点和事务的回滚机制。

? 本文的操作并不难,但是细节上的原理上的理解还是比较琐碎拗口的,需要真正的理解,面试的时候这块内容十分重要,谢谢您的阅读!

原文地址:https://blog.51cto.com/14557673/2464798

时间: 2024-12-10 05:14:35

MySQL索引与事务详解的相关文章

PHP mysql与mysqli事务详解

官方对PHP连接到MySQL数据库服务器的三种主要的API简介如下: http://php.net/manual/zh/mysqli.overview.php PHP mysql与mysqli事务详解 在PHP中,mysqli 已经很好的封装了mysql事务的相关操作.如下示例: $sql1 = "update User set ScoreCount = ScoreCount +10 where ID= '123456'"; $sql2 = "update ScoreDeta

mysql之事务详解

mysql之事务详解 2015年12月16日 21:28:35 阅读数:6178 我们知道,应用中的一个业务逻辑,往往由多条语句组合完成.那么我们就可以简单地将事务理解为一组SQL语句的集合,要么这个集合全部成功集合,要么这个集合就全部失败退回到第一句之前的状态. 语法 我们先来看看事务的语法.现在的社会比较浮躁,大家往往只在乎如何解决问题,而不去考虑问题的本质到底是什么. 所以我决定先来介绍事务的语法: 1. 开启事务start transaction,可以简写为 begin 2. 然后记录之

Mysql数据库的索引和视图详解

Mysql数据库的索引和视图详解 索引的概念 数据库的索引与书籍中的目录类似在一本书中,无需阅读整本书,利用目录就可以快速查找所需信息书中的目录是一个词语列表,其中注明了包含各个词的页码数据库索引在数据库中,索引数据库程序无需对整个表进行扫描,就可以在其中找到所需数据数据库中的索引是某个表中一列或若干列的集合,以及物理标识这些值的数据页的逻辑指针清单 索引的作用 设置了合适的索引之后,数据库利用葛总快速的定位技术,能够大大加快查询速率特别是当表很大时,或者查询涉及到多个表时,使用索引可使查询加快

Mysql配置文件my.ini详解

原链接:http://blog.sina.com.cn/s/blog_718ac8bf0100pkvp.html 以下是Mysql数据库服务器配置文件my.ini的详细配置.应用场合是InnoDB引擎,2核CPU, 32位SUSE. [client] #password = your_password port  = 3306 socket  = /tmp/mysql.sock # Here follows entries for some specific programs # The MyS

重新学习MySQL数据库7:详解MyIsam与InnoDB引擎的锁实现

重新学习Mysql数据库7:详解MyIsam与InnoDB引擎的锁实现 说到锁机制之前,先来看看Mysql的存储引擎,毕竟不同的引擎的锁机制也随着不同. 三类常见引擎: MyIsam :不支持事务,不支持外键,所以访问速度快.锁机制是表锁,支持全文索引 InnoDB :支持事务.支持外键,所以对比MyISAM,InnoDB的处理效率差一些,并要占更多的磁盘空间保留数据和索引.锁机制是行锁,不支持全文索引(5.6以上支持) Memory:数据是存放在内存中的,默认哈希索引,非常适合存储临时数据,服

mysql explain执行计划详解

1).id列SELECT识别符.这是SELECT查询序列号.这个不重要,查询序号即为sql语句执行的顺序 2).select_type列常见的有: A:simple:表示不需要union操作或者不包含子查询的简单select查询.有连接查询时,外层的查询为simple,且只有一个 B:primary:一个需要union操作或者含有子查询的select,位于最外层的单位查询的select_type即为primary.且只有一个 C:union:union连接的两个select查询,第一个查询是de

MySQL 执行计划explain详解

MySQL 执行计划explain详解 2015-08-10 13:56:27 分类: MySQL explain命令是查看查询优化器如何决定执行查询的主要方法.这个功能有局限性,并不总会说出真相,但它的输出是可以获取的最好信息,值得花时间去了解,因为可以学习到查询是如何执行的. 调用EXPLAIN 在select之前添加explain,mysql会在查询上设置一个标记,当执行查询计划时,这个标记会使其返回关于执行计划中每一步的信息,而不是执行它.它会返回一行或多行信息,显示出执行计划中的每一部

MySQL中EXPLAIN命令详解

explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上explain就可以了: 如: explain select surname,first_name form a,b where a.id=b.id EXPLAIN列的解释: table:显示这一行的数据是关于哪张表的 type:这是重要的列,显示连接使用了何种类型.从最好到最差的连接类型为const.eq_reg.ref.range.in

MySQL UUID函数的详解(转)

MySQL UUID函数的详解 MySQL中可以有二类用于生成唯一值性质的工具:UUID()函数和自增序列,那么二者有何区别呢?我们就此对比下各自的特性及异同点: l  都可以实现生成唯一值的功能: l  UUID是可以生成时间.空间上都独一无二的值:自增序列只能生成基于表内的唯 一值,且需要搭配使其为唯一的主键或唯一索引: l  实现方式不一样,UUID是随机+规则组合而成的,而自增序列是控制一个值逐步增长的: l  UUID产生的是字符串类型值,固定长度为:36个字符,而自增序列产生的是整数