MySQL索引与事务

MySQL索引与事务

技能目标

  • 理解索引的概念并掌握索引的创建
  • 理解事务的盖帘并掌握事务的操作

索引的概念及分类

1:索引的概念
  • 索引是一种特殊的文件,包含着对数据表中所有记录的引用指针
2:索引的作用
  • 建立索引的目的是加快对表中记录的查找或顺序
(1) 设置了适合的索引之后,数据库利用各种快速的定位技术,可以大大加快查询速度,这也是创建索引的主要元婴
(2) 当表很大时,或者涉及多个表时,使用索引可使查询速度加快成千倍
(3) 可以降低数据库中IO成本并且索引还可以降低数据库的排序成本
(4) 通过建立唯一索引,可以保证数据库表中每一行数据的唯一性
(5) 可以加快表与表中的连接
(6) 使用分组和排序子句进行数据查询时,可以显著减少查询中分组和排序的时间
3:索引的分类
MySQL的索引分为以下几类:
  • 普通索引,这是最基本的索引类型,而且没有唯一性的限制
  • 唯一性索引,这与前面的普通索引基本相同唯一不同在于索引的列所有值只能出现一次,不允许有空值
  • 主键索引,主键索引是一种唯一性的索引,但它必须指定“PRIMARY KEY”。
  • 全文索引,索引类型为FULLTEXT,全文索引可以在CHAR VARCHAR或者TEXT类型的列上创建
  • 单列多列索引,索引是单列上创建的索引,也可以是在多列上创建的索引

索引详细信息

显示参数 描述
Table 表的名称
Non_unique 索引值的唯一性,0表示唯一性,1表示非唯一
Key_name 索引的名称
Seq_in_index 索引中的序列号从1开始
Column_name 列名称

实验

1:创建索引的方法
创建普通索引的命令格式
ceate index<索引的名字>no tablename(列的列表)
  • 准备了一个数据库(学员信息)里面有里面创建了(班级学员信息表)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| 学员信息           |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)
mysql> use 学院信息;
mysql> create table 班级学员信息(学号 int,名字 varchar(10),分数 int,爱好 varchar(10));
mysql> select * from 班级学员信息;
+--------+--------+--------+--------+
| 学号   | 名字   | 分数   | 爱好   |
+--------+--------+--------+--------+
|      1 | 张三   |     88 | 1      |
|      2 | 李四   |     88 | 2      |
|      3 | 王五   |     88 | 1      |
+--------+--------+--------+--------+
3 rows in set (0.00 sec)

mysql> create index name_index on 班级学员信息(学号); #创建普通索引实例
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> show index from 班级学员信息; #查看索引信息
+--------------------+------------+------------+--------------+-------------+---------
--+-------------+----------+--------+------+------------+---------+---------------+
| Table              | Non_unique | Key_name   | Seq_in_index | Column_name | Collatio
n | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+--------------------+------------+------------+--------------+-------------+---------
--+-------------+----------+--------+------+------------+---------+---------------+
| 班级学员信息       |          1 | name_index |            1 | 学号        | A
  |           3 |     NULL | NULL   | YES  | BTREE      |         |               |
+--------------------+------------+------------+--------------+-------------+---------
--+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.00 sec)
  • 上图key_name对应的是索引名字(名字为name_index),Non_unique对应值是1表示不是唯一索引
创建唯一索引的命令格式
create unique index<索引的名字>on tablename(列的列表)
  • 该索引比普通索引多了一个unique关键字,下面对名字创建唯一性索引
mysql> create unique index name_unique_index on 班级学员信息(名字);
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> show index from 班级学员信息;
+--------------------+------------+-------------------+--------------+-------------+-----------+-------------+----------+--
------+------+------------+---------+---------------+
| Table              | Non_unique | Key_name          | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | P
acked | Null | Index_type | Comment | Index_comment |
+--------------------+------------+-------------------+--------------+-------------+-----------+-------------+----------+--
------+------+------------+---------+---------------+
| 班级学员信息       |          0 | name_unique_index |            1 | 名字        | A         |           3 |     NULL | N
ULL   | YES  | BTREE      |         |               |
+--------------------+------------+-------------------+--------------+-------------+-----------+-------------+----------+--
------+------+------------+---------+---------------+
1 row in set (0.00 sec)
  • 上图名为name_unique_index的索引已创建,他的Non_unique为0,表示唯一性索引
创建主键索引有两种方式
1):在创建表的同时创建主键,2):在已经创建的表中没有指定主键,然后修改表加入主键,主键索引会自动创建
创建主键索引的命令格式
1):创建表格的同时指定主键
create table tablename([...],primary key(列的列表));
mysql> show tables;                    #在学员信息里面有三个表现在我重新创建一个新表在创建新编的同时定义主键
+------------------------+
| Tables_in_学员信息     |
+------------------------+
| 学生爱好               |
| 爱好                   |
| 班级学员信息           |
+------------------------+
3 rows in set (0.00 sec)

mysql> create table 学生兴趣 (编号 int(4)primary key, 爱好 varchar(10));
Query OK, 0 rows affected (0.01 sec)

mysql> desc 学生兴趣;               #创建了主键的表看一下两者区别创建主键的表Key里面多一个PRI
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| 编号   | int(4)      | NO   | PRI | NULL    |       |
| 爱好   | varchar(10) | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> desc 爱好;                #原有的表没有创建主键的表没有创建主键的表Key里面是空的
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| 编号   | int(4)      | YES  |     | NULL    |       |
| 爱好   | varchar(10) | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
2):创建表格之后没有创建主键修改该表格后加入主键格式主键索引会自动创建:
alter table tablename add primary key(列的列表);
mysql> create table 学生爱好 (编号 int(4), 爱好 varchar(10));
Query OK, 0 rows affected (0.01 sec)

mysql> desc 学生爱好;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| 编号   | int(4)      | YES  |     | NULL    |       |
| 爱好   | varchar(10) | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> alter table 学生爱好 add constraint pk_id primary key 学生爱好 (编号);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc 学生爱好;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| 编号   | int(4)      | NO   | PRI | NULL    |       |
| 爱好   | varchar(10) | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
创建多列索引只需要在创建索引的时候制定多列即可命令格式为
create index duolie_index on 班级学员信息(学号,名字);
mysql> create index duolie_index on 班级学员信息(学号,名字);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from 班级学员信息;
+--------------------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table              | Non_unique | Key_name     | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+--------------------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| 班级学员信息       |          1 | duolie_index |            1 | 学号        | A         |           3 |     NULL | NULL   | YES  | BTREE      |         |               |
| 班级学员信息       |          1 | duolie_index |            2 | 名字        | A         |           3 |     NULL | NULL   | YES  | BTREE      |         |               |
+--------------------+------------+--------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.00 sec)

mysql> alter table 班级学员信息 drop column 学号; #删除多列索引中其中一个索引
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0
不需要索引时删除命令(大写为固定格式再mysql中不区分大小写)
  • DROP INDEX index_name ON table_name; #大写为固定格式index_name为索引名称table_name为删除哪张表格中的索引
  • ALTER TABLE table_name DROP INDEX index_name #删除那张表格的哪一个索引
  • ALTER TABLE table_name DORP PRIMARY KEY; #删除主键
查看索引放法
  • SHOW KEY FROM table_name
  • SHOW INDEX FROM table_name #在后面加上\G竖向显示索引信息即为:SHOW INDEX FROM table_name\G

主键和外键
(1) 主键
  • 数据表中每行记录都必须是唯一的,而不允许出现完全相同的记录,通过定义主键,可以保证记录(实体)的唯一性
  • 键,即是关键字,他是关系模型中非常重要的一个元素
  • 如果一个属性能有唯一的标识,没有多余的属性,那么这个属性集称为候选键
  • 从表中的主键是主表中的外键且数值唯一不能为空
(2)外键
  • 一个关系数据库通常包含多个表,通过外键可以使这些表关起来
  • 主表中的外键是从表中的主键且数值唯一不能为空
实验
下面有两张表上面一个是主表编号是主键爱好是外键下面一个是从表编号是主键
mysql> select * from 六年级二班学生数据表;
+--------+--------+--------+--------+
| 编号   | 姓名   | 学分   | 爱好   |
+--------+--------+--------+--------+
|      1 | 张三   |     80 |      1 |
|      2 | 李四   |     81 |      2 |
|      3 | 王五   |     81 |      3 |
|      4 | 赵六   |     99 |      2 |
+--------+--------+--------+--------+
4 rows in set (0.00 sec)

mysql> select * from 六年级二班兴趣爱好表;
+--------+-----------+
| 编号   | 爱好      |
+--------+-----------+
|      1 | 看书      |
|      2 | 玩游戏    |
|      3 | 游玩      |
|      4 | 打球      |
+--------+-----------+
4 rows in set (0.00 sec)
把上面两张表关联查询编号、姓名、学分、爱好,用一张表的形式去显示实际这张表不存在的
mysql> select i.编号,i.姓名,i.学分,h.爱好 from 六年级二班学生数据表 i join 六年级二班兴趣爱好表 h on i.爱好=
+--------+--------+--------+-----------+
| 编号   | 姓名   | 学分   | 爱好      |
+--------+--------+--------+-----------+
|      1 | 张三   |     80 | 看书      |
|      2 | 李四   |     81 | 玩游戏    |
|      4 | 赵六   |     99 | 玩游戏    |
|      3 | 王五   |     81 | 游玩      |
+--------+--------+--------+-----------+
4 rows in set (0.00 sec)

MySQL 数据库事务

2:事物的概念及特点
事务是一种机制,一个操作序列,包含了一组数据库操作命令,并且把所有命令作为一个整体一起向系统提交或撤销操作请求,即这一组命令要么执行要么撤销。事务是一个不可分割的逻辑单元,在数据库系统上执行并发操作时事务是做小的控制单元。
事务的ACID特性
  • 原子性:事务是一个完整的操作,个元素是不可分的,即原子的
  • 一致性:当事务完成时事务必须处于同一个状态
  • 隔离性:对事物进行修改的所有并发事务是彼此隔离的,每个事物都是单独存在的
  • 持久性:指不管系统是否发生故障,事务处理的结果都是永久的
使用事务命令控制事务
  • begin 表示开始一个事务,后面会有多条数据操作语句执行
  • commit 表示提交事务,对应前面begin操作
  • rollback 表示回滚一个事务,再begin和commit之间如果某一个数据库操作语句出现错误,执行rollback回滚数据回到begin之前的状态

实验

用begin在学院班级息里面六年级二班学生数据表中再添加一个人员
mysql> create database 数据;
Query OK, 1 row affected (0.00 sec)

mysql> use 数据;
Database changed
mysql> use 学院班级信息;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

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

mysql>insert
    -> into 六年级二班学生数据表 values (5,‘田七‘,2,1); #在表中插入这段信息
Query OK, 1 row affected (0.00 sec)
mysql> select
    -> * from 六年级二班学生数据表;
+--------+--------+--------+--------+
| 编号   | 姓名   | 学分   | 爱好   |
+--------+--------+--------+--------+
|      1 | 张三   |     80 |      1 |
|      2 | 李四   |     81 |      2 |
|      3 | 王五   |     81 |      3 |
|      4 | 赵六   |     99 |      2 |
|      5 | 田七   |      2 |      1 |
+--------+--------+--------+--------+
5 rows in set (0.00 sec)  #查看表中数据有田七这个人员信息
#我们另开一个终端登入数据库再查看表的信息
mysql> select * from 六年级二班学生数据表;
+--------+--------+--------+--------+
| 编号   | 姓名   | 学分   | 爱好   |
+--------+--------+--------+--------+
|      1 | 张三   |     80 |      1 |
|      2 | 李四   |     81 |      2 |
|      3 | 王五   |     81 |      3 |
|      4 | 赵六   |     99 |      2 |
+--------+--------+--------+--------+
4 rows in set (0.00 sec)
#从另一个终端的数据库看不到田七数据因为begin只是开始一个事务并没有提交
#想要提交事务用commit提交 如果怕后面出错可以在这边进行一个留档
mysql> savepoint s1;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into 六年级二班学生数据表 values (6,‘黑八‘,77,4);
Query OK, 1 row affected (0.00 sec)

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

mysql> select * from 六年级二班学生数据表;
+--------+--------+--------+--------+
| 编号   | 姓名   | 学分   | 爱好   |
+--------+--------+--------+--------+
|      1 | 张三   |     80 |      1 |
|      2 | 李四   |     81 |      2 |
|      3 | 王五   |     81 |      3 |
|      4 | 赵六   |     99 |      2 |
|      5 | 田七   |      2 |      1 |
|      6 | 黑八   |     77 |      4 |
+--------+--------+--------+--------+
6 rows in set (0.00 sec)
#如果再第二个留档中出错了用rollback to savepoint s1;
mysql> rollback to savepoint s1;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from 六年级二班学生数据表;
+--------+--------+--------+--------+
| 编号   | 姓名   | 学分   | 爱好   |
+--------+--------+--------+--------+
|      1 | 张三   |     80 |      1 |
|      2 | 李四   |     81 |      2 |
|      3 | 王五   |     81 |      3 |
|      4 | 赵六   |     99 |      2 |
|      5 | 田七   |      2 |      1 |
+--------+--------+--------+--------+
5 rows in set (0.00 sec)
#此时留档二中的黑八就叫已经不存在了,注:回滚到上一个s1的留档的位置那么从s1下面所有操作的事务全都不存在了
用set sutocommit=0关闭自动提交
mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into 六年级二班学生数据表 values (6,‘黑八‘,77,4);
Query OK, 1 row affected (0.00 sec)

mysql> select * from 六年级二班学生数据表;
+--------+--------+--------+--------+
| 编号   | 姓名   | 学分   | 爱好   |
+--------+--------+--------+--------+
|      1 | 张三   |     80 |      1 |
|      2 | 李四   |     81 |      2 |
|      3 | 王五   |     81 |      3 |
|      4 | 赵六   |     99 |      2 |
|      6 | 黑八   |     77 |      4 |
+--------+--------+--------+--------+
5 rows in set (0.00 sec)
#上表关闭了自动提交功能然后操作事务不会自动提交相当于执行了begin同样在另一个终端登录的时候不会显示出来
#如果set autocommit=1开启自动提交那么以上正在进行的事务自动提交相当于执行了begin语句中的commit

本次实验总结

  • 数据库索引分为:普通索引,唯一索引,主键索引,全文索引,多列索引
  • 数据库索引可以协助快速查询表中数据,但并不是任何字段都是和索引(数据至少不少于1000行才能看出效果)
  • 数据库事物的ACID特性
  • MySQL事务命令有begin、rollback、commit、savrpoint。

原文地址:http://blog.51cto.com/13645280/2133337

时间: 2024-08-28 21:00:47

MySQL索引与事务的相关文章

MySQL索引与事务,视图,存储引擎MylSAM和lnnoDB

MySQL索引与事务,视图,存储引擎MylSAM和lnnoDB 索引的概念 数据库中的索引与书籍中的目录类似: 1.-本书中,无须阅读整本书,利用目录就可以快速查找所需信息2.书中的目录是一个词语列表,其中注明了包含各个词的页码 数据库索引: 1.在数据库中,索弓|使数据库程序无须对整个表进行扫描,就可以在其中找到所需数据2.数据库中的索弓|是某个表中一-列或者若干列值的集合,以及物理标识这些值的数据页的逻辑指针清单 索引的作用: 1.设置了合适的索引之后,数据库利用各种快速的定位技术,能够大大

MySQL索引与事务详解

MySQL索引与事务详解 一.前言 ? 上一章我们讲解了MySQL的手工编译安装流程以及相关的数据库操作命令(sql语句),本文将要详细介绍MySQL索引与事务的概念及原理,并初步了解MySQL数据库视图概念,简述数据库的存储过程. 二.索引 2.1索引的概念--什么是索引? ? 一般来说,一篇论文,或者说一本书,都有其目录,而目录一般是所有章节的概述,或者说是要点核心,而索引的概念其实也与之类似. ? 索引,顾名思义,就是一个方便用户搜索所需资源的引导,只不过在数据库中,索引一般被认为是一种特

mysql 索引和事务、视图

MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度,数据库索引就好比好比是一本书全面的目录. 索引分5类 普通索引,这是最基本的索引类型,而且他没有唯一性之类的限制. 唯一性索引,这种索引和前面的"普通索引"基本相同,但有一个区别:索引列的所有值只能出现一次,即必须唯一. 主键索引,主键是一种唯一性索引,该索引要求主键中的每个值都唯一,不允许为空. 全文索引,索引类型为FULLTEXT,全文索引可以在CHAR.VARCHAR或者TEXT类型的列

MySQL——索引视图事务,存储引擎MyLSAM和InnoDB(实战篇!)

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

MySQL索引与事务、存储引擎MyISAM和InnoDB (理论+实践篇)

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

mysql索引,事务

1.开启数据库,创建数据库,表等.2.创建普通索引3.创建唯一索引4.创建主键索引5.删除索引6.删除主键7.修改表结构(1.增加一列)(2.删除已列)(3.修改列的内容)8.创建全文索引9.创建多列索引10.事务 原文地址:http://blog.51cto.com/13813317/2286712

mysql索引优化

mysql 索引优化 >mysql一次查询只能使用一个索引.如果要对多个字段使用索引,建立复合索引. >越小的数据类型通常更好:越小的数据类型通常在磁盘.内存和CPU缓存中都需要更少的空间,处理起来更快. >简单的数据类型更好:整型数据比起字符,处理开销更小,因为字符串的比较更复杂.在MySQL中,应该用内置的日期和时间数据类型,而不是用字符串来存储时间:以及用整型数据类型存储IP地址. >尽量避免NULL:应该指定列为NOT NULL,除非你想存储NULL.在MySQL中,含有空

理解MySQL——索引与优化

转自:理解MySQL——索引与优化 写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录.如果没有索引,查询将对整个表进行扫描,最坏的情况下,如果所有数据页都不在内存,需要读取10^4个页面,如果这10^4个页面在磁盘上随机分布,需要进行10^4次I/O,假设磁盘每次I/O时间为10ms(忽略数据传输时间),则总共需要100s(但实际上要好很多很多).如果对之建立B-Tr

mysql索引的使用和优化

参考: http://blog.csdn.net/xluren/article/details/32746183 http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.html 关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车.对于没有索引的表,单表查询可能几十万数据就是瓶颈,而通常大型网站单日就可能会产生几十万甚至几百万的数据,没有索引查询会变