索引及分类
1)索引的概念
索引是一种特殊的文件,包含着对数据表中所有记录的引用指针
2)索引的作用

设置了合适的索引之后,数据库利用各种快速的定位技术,可以大大加快数据的查询速度

当表大时,或者查询涉及多个表时。使用索引可使查询速度加快上千倍

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

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

可以加快表与表中的连接

在使用分组个排序子句进行数据查询时。可以显著减少查询中分组和排序的时间
3)索引的分类

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

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

主键索引,主键是一种唯一性索引,但他必须指定为“peimary key”

全文索引,索引类型为fulltext.全文索引可以在char,varchar或者text类型的列上创建

单列索引与多列索引,索引可以是单列上创建的索引,也可以实在多列上创建的索引
4)创建索引的原则依据

表的主键、外键必须有索引

数据量超过300行的表应该有索引

经常与其他表进行表连接的表

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

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

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

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

索引应建在小字段上
建立数据库及数据表
创建索引一共有三种方式

创建表 直接定义

create index 索引名称 on 表名

alter table 表名 add index 索引名称

mysql> create database school;
#设置数据表
create table unfo ( id int(4) not null primary key auto_increment, name varchar(10) not null, address varchar(50) default 'nanjing',, age int(3) not null);
mysql> insert into info (name,address,age) values ('zhangsan','beijing',20),('lisi','shanghai',22);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

创建索引
第一种

#针对年龄创建索引
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);
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| 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      |         |               |
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.01 sec)

第三种方法 创建表时直接创建索引

mysql> create table user (-> id int(4) not null primary key auto_increment,-> name varchar(10) not null,-> score decimal not null,-> index index_score (score));mysql> show index from user;ysql> show index from user;
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name    | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| user  |          0 | PRIMARY     |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| user  |          1 | index_score |            1 | score       | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+-------------+--------------+-------------

将两张数据表关联起来查看

#建立两张表
mysql> select * from user;
+----+--------+-------+-------+
| id | name   | score | hobby |
+----+--------+-------+-------+
|  1 | test01 |    88 |     1 |
|  2 | stu01  |    99 |     2 |
|  3 | wangwu |    77 |     3 |
+----+--------+-------+-------+
mysql> select * from hob-> ;
+----+----------+
| id | hob_name |
+----+----------+
|  1 | 看书     |
|  2 | 运动     |
|  3 | 游戏     |
+----+----------+
3 rows in set (0.00 sec)
mysql> select user.name,hob.hob_name from user inner join hob on user.hobby=hob.id;
+--------+----------+
| name   | hob_name |
+--------+----------+
| test01 | 看书     |
| stu01  | 运动     |
| wangwu | 游戏     |
+--------+----------+
//设置别名(方便操作)
mysql> select a.name,b.hob_name from user a inner join hob b on a.hobbby
+--------+----------+
| name   | hob_name |
+--------+----------+
| test01 | 看书     |
| stu01  | 运动     |
| wangwu | 游戏     |
+--------+----------+

创建视图

create view view_user as select a.name,b.hob_name from user a inner join hob b on a.hobby=b.id;
mysql> select * from view_user-> ;
+--------+----------+
| name   | hob_name |
+--------+----------+
| test01 | 看书     |
| stu01  | 运动     |
| wangwu | 游戏     |
+--------+----------+
#设置全文索引
mysql> create fulltext index full_addr on info (address);

事务的概念
事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,既这一组数据库命令要么都执行,要么都不执行。
事务ACID特性

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

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

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

持久性:指不管系统是否发生了故障,事务处理的结果都是永久的。一旦事务被提交,事务的效果会效果会被永久地保留在数据库中
事务的操作
MySQL操作事务
默认情况下MySQL的事务是自动提交的。之前我们用sql操作数据库时,一条语句执行后,系统会自动执行事务提交。当需要把一组语句作为一个事务提交时,需要手动对事物进行控制。手动控制事务有两种方法,一种是使用事务处理命令控制,另一种是使用set设置事务的处理方式

使用事务命令控制事务
begin:表示开始一个事务,后面会有多条数据库操作语句执行
commit:表示提交一个事务,对应前面的begin操作,他们之间的数据库操作语句一起完成
rollback:表示回滚一个事务,在begin和commit之间,如果某一个数据库操作语句出现错误,执行rollback回滚,数据库回到begin之前的状态,也就是操作语句都没有执行

创建数据库和表

mysql> create database user;
mysql> use user
mysql> create table info (-> id int(4) not null primary key auto_increment,   //auto_increment   自动增长-> name varchar(10) not null,-> address varchar(50) default 'nanjing',-> age int(3) not null);
Query OK, 0 rows affected (0.05 sec)
mysql> insert into info (name,address,age) values ('zhangsan','baijing',20);
Query OK, 1 row affected (0.00 sec)
mysql> insert into info (name,address,age) values ('lisi','shanghai',22);
Query OK, 1 row affected (0.00 sec)
mysql> insert into info (name,address,age) values ('wangwu','hangzhou)',30);
Query OK, 1 row affected (0.00 sec)

开启事务

mysql> begin;
Query OK, 0 rows affected (0.00 sec)
#设置一行数
mysql> insert into info (name,address,age) values ('tianqi','baijin',30);
Query OK, 1 row affected (0.01 sec)
#设置节点
mysql> savepoint a;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into info (name,address,age) values ('css','baijin',31);
Query OK, 1 row affected (0.01 sec)
mysql> savepoint b;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from info;
+----+----------+----------+-----+
| id | name     | address  | age |
+----+----------+----------+-----+
|  1 | zhangsan | baijing  |  20 |
|  2 | lisi     | shanghai |  22 |
|  3 | wangwu   | hangzhou |  30 |
|  4 | tianqi   | baijin   |  30 |
|  5 | css      | baijin   |  31 |
+----+----------+----------+-----+
5 rows in set (0.01 sec)
#利用rollback回滚到tianqi
mysql> rollback to amysql> select * from info;
+----+----------+----------+-----+
| id | name     | address  | age |
+----+----------+----------+-----+
|  1 | zhangsan | baijing  |  20 |
|  2 | lisi     | shanghai |  22 |
|  3 | wangwu   | hangzhou |  30 |
|  4 | tianqi   | baijin   |  30 |
+----+----------+----------+-----+
mysql> commit-> ;
  • 使用set设置控制事务
    set autocommit=0 禁止自动提交
    set autocommit=1 开启自动提交
    使用set autocommit=0 设置自动提交,最后使用commit提交事务

MysQL索引与事务相关推荐

  1. 互联网行业中最常用的数据库——MySQL 索引、事务与存储引擎

    MySQL 索引.事务与存储引擎 一.MySQL 索引 1.1 索引的概念 1.2 索引的作用及缺点 1.2.1 优点 1.2.2 缺点 1.3 创建索引的原则依据 1.4 索引的分类和创建 1.4. ...

  2. mysql索引与事务笔记_《MySQL技术内幕:InnoDB存储引擎》读书笔记五-锁、索引及事务...

    1.锁mysql 1)锁是数据库系统区别于文件系统的一个关键特性,数据库使用锁是为了支持对共享资源进行并发访问,提供数据的完整性和一致性.算法 2)每一种数据库实现锁的方式都不一样.sql 共享锁:容 ...

  3. mysql索引和事务_MySQL事务和索引

    课程描述: 先修条件 所有对数据库感兴趣的人群,建议先学习或掌握以下技能: MySQL数据库操作  课程 技能描述 事务是作为一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为 ACI ...

  4. 理论+实操: MySQL索引与事务、视图、存储过程(软件开发用的多)、存储引擎MyISAM和InnoDB

    文章目录 一:索引的概念 二:索引的作用 三:索引的分类 3.1 普通索引 3.2 唯一性索引 3.3 主键 3.4 全文索引 3.5 单列索引与多列索引 四:创建索引的原则依据 五:创建索引的方法 ...

  5. 数据库之Mysql索引、事务与存储引擎

    目录 1 MySQL索引 1.1 索引的概念 1.2 索引的作用 1.3 创建索引的原则依据 1.4 索引的分类和创建 普通索引 唯一索引 主键索引 组合索引(单列索引与多列索引) 全文索引(FULL ...

  6. 看完就懂——MySQL索引、事务与存储引擎

    目录 前言 一.索引(index) 1.1 索引的概念 1.2 索引的作用 1.3 索引的优缺点 1.4 索引的分类 1.5 创建索引的原则依据 1.6 创建索引 1.6.1 普通索引 1.6.2 唯 ...

  7. MySQL索引、事务与引擎基础详解,理论加实例

    目录 一.索引 1.1普通索引 1.2唯一性索引 1.3主键索引 1.4组合索引 1.5全文索引 1.6索引的查看 1.7索引的删除 二.事务 2.1事务的ACID特点 2.2事务控制语句 2.3事务 ...

  8. MySQL 索引、事务与存储引擎

    目录 一.MySQL 索引 1.索引的概念 2.索引的作用 3.索引的副作用 4.创建索引的原则依据 5.索引的分类和创建 1.普通索引 2.唯一索引 3.主键索引 4.组合索引(单列索引与多列索引) ...

  9. 窥探MySQL索引与事务

    目录 一.MySQL索引 1.1.概念 1.2.作用 1.3.使用场景 ①哈希索引 ②TREE ③BTREE ④B+TREE 1.4.使用 ①查看索引 ②创建索引 ③删除索引 1.5.MySQL面试 ...

  10. 3天,把MySQL索引、事务、分库分表撸干净了!

    前两天看到字节一个老哥写的帖子,提到高阶开发者必须掌握的技能,其中他明确提出了"精通MySQL". 为啥MySQL对开发人员如此重要? 第一,不管你去面试哪家公司,数据库是必问项, ...

最新文章

  1. 通信系统之信道(二)
  2. 【Scratch】青少年蓝桥杯_每日一题_1.17_春夏秋冬四季
  3. Visual Studio Code常用快捷键
  4. 无法使用JDK 8卸载JavaFX SceneBuilder 1.0
  5. python哪些类型可以作为迭代器_python0.8-----set类型与迭代器
  6. linux恢复deleted状态的文件,Linux恢复被删除的文件 How To Recover Deleted Files From Your Linux System ....
  7. join为什么每个字符都分割了 js_2019JS必看面试题
  8. PC微信逆向之发送消息
  9. 运维审计平台之堡垒机和跳板机
  10. 活动|QuarkChain 高TPS悬赏令:看你能有多快!2.4BTC等你拿!
  11. 有哪些在家健身的软件?Mac健身软件推荐
  12. 服务器2019添加虚拟机,Hyper-V安装Server 2019虚拟机图文教程
  13. Android 通过bmob十分钟实现即时通讯
  14. 心知天气api PHP,心知天气API的应用实例
  15. 优秀开源云原生工具推荐——系列3
  16. 微信小程序—仿美团酒店入住日期时段选择
  17. 4.2.3 积分法(二)——分部积分法
  18. asp.net办公自动化OA系统
  19. 原生JS鼠标移动拖尾效果
  20. oracle 字符集问题

热门文章

  1. mycat + keepalived + haproxy + mmm
  2. 为什么趁年轻就应该去创业?
  3. 【Go语言刷题篇】Go完结篇函数、结构体、接口、错误入门学习
  4. sox源码分析:sox_find_effect()
  5. 5分钟了解英文SEO做外链的正确姿势
  6. android use-feature和market策略
  7. SpringBoot——检索
  8. 【lphtw】第三弹笔记ex24-ex35
  9. Python轻松实现地图可视化(附详细源码)
  10. bootstrap日期插件daterangepicker的使用