索引与事务

索引的概念

  • 数据库索引
    • 是一个排序的列表,存储着索引值和这个值所对应的物理地址
    • 无需对整个表进行扫描,通过物理地址就可以找到所需数据
    • 是表中一列或若干列值排序的方法
    • 需要额外的磁盘空间

索引的作用

  • 数据库利用各种快速定位技术,能够大大加快查询速率
  • 当表很大或查询涉及到多个表是,可以成千上万倍的提高查询速度
  • 可以降低数据库的IO成本,并且还可以降低数据库的排序成本
  • 通过创建唯一索引保证数据表数据的唯一性
  • 可以加快表与表之间的连接
  • 在使用分组和排序时,可大大减少分组和排序时间

索引的分类

普通索引
  • 最基本的索引类型,没有唯一性之类的显示

  • 创建普通索引的方式

    #直接创建索引语法
    mysql>CREATE INDEX index_name ON table_name(column(length));
    #修改表结构的方式添加索引语法
    mysql>ALTER TABLE table_name ADD INDEX index_name (column(length));
    
    #创建表结构时,同时创建索引
    CREATE TABLE table01 ( 
    id int(11) NOT NULL AUTO_INCREMENT , 
    title char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , 
    content text CHARACTER SET utf8 COLLATE utf8_general_ci NULL , 
    time int(10) NULL DEFAULT NULL , 
    PRIMARY KEY (id), 
    INDEX index_table01_title (title(11)) 
    );
    
唯一性索引
  • 与“普通索引”基本相同

  • 与普通索引的区别是索引列的索引值只能出现一次,即必须唯一

  • 创建唯一索引的方式

    #创建唯一索引语法
    mysql>CREATE UNIQUE INDEX index_name ON table_name(column(length)); 
    #修改表结构的时候添加唯一索引语法
    mysql>ALTER TABLE table_name ADD UNIQUE index_name (column(length)); 
    
    #创建表的时候同时创建唯一索引
    CREATE TABLE table02 ( 
    id int(11) NOT NULL AUTO_INCREMENT , 
    title char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , 
    content text CHARACTER SET utf8 COLLATE utf8_general_ci NULL , 
    time int(10) NULL DEFAULT NULL , 
    PRIMARY KEY (id), 
    UNIQUE index_table02_title (title(11)) 
    );
    
主键索引
  • 是一种特殊的唯一索引,指定位"PRIMARY KEY"

  • 一个表只能有一个主键,不允许有空值

  • 创建主键索引的方式

    #创建主键索引语法
    CREATE TABLE table_name ( 
    id int(11) NOT NULL AUTO_INCREMENT , 
    title char(255) NOT NULL , 
    PRIMARY KEY (id) 
    );
    
组合索引(单列索引与多列索引)

最左原则

  • 可以是单列上创建的索引,也可以是在多列上创建的索引

  • 最左原则,从左往右依次执行

  • 创建组合索引的方式

    create table user(
    name varchar(9),
    age int(3),
    sex tinyint(1),
    INDEX user(name,age,sex)
    );
    
全文索引
  • MySQL从3.23.23版开始支持全文索引和全文检索

  • 索引类型位FULLTEXT

  • 可以在CHAR、VARCHAR或TEXT类型的列创建

  • 创建全文索引的方式

    #直接创建索引语法:
    mysql>CREATE FULLTEXT INDEX index_content ON article(content);
    
    #修改表结构添加全文索引语法: 
    mysql>ALTER TABLE article ADD FULLTEXT index_content(content);
    #创建表的全文索引语法: 
    CREATE TABLE table ( 
    id int(11) NOT NULL AUTO_INCREMENT , 
    title char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , 
    content text CHARACTER SET utf8 COLLATE utf8_general_ci NULL , 
    time int(10) NULL DEFAULT NULL , 
    PRIMARY KEY (id), 
    FULLTEXT (content) 
    )ENGINE=MyISAM;
    
创建索引的原则依据
  • 表的主键、外键必须有索引
  • 记录超过300行的表应该有索引
  • 经常与其他表进行连接的表,在连接字段上应该建立索引
  • 唯一性太差的字段不适合建立索引
  • 更新太频繁的字段不适合创建索引查看索引
  • 经常用where指定的条件进行查询的,适合创建索引
  • 建立索引的列尽量是小字段
删除索引

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

#方式一
drop index 索引名称  on 表名;
#方式二
alter table 表名 drop index 索引名;
事务的概念
  • 是一种机制、一个操作序列、包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行
  • 是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元
  • 适用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等等
  • 通过事务的整体性以保证数据的一致性

事务的ACID特点

原子性(Atomicity)
  • 事务是一个完整的操作,事务的个元素是不可分的
  • 事务中的所有元素必须作为一个整体提交或回滚
  • 如果事务中的任何元素失败,则整个事务将失败
一致性(Consistency)
  • 当事务完成时,数据必须处于一致状态
  • 在事务开始前,数据库中存储的数据处于一致状态
  • 在正在进行的事务中,数据可能处于不一致的状态
  • 当事务成功完成时,数据必须再次回到已知的一致状态
隔离性(Isolation)
  • 对数据进行修改的所有并发事务是彼此隔离的,表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务
  • 修改数据的事务可在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据
持久性(Durability)
  • 指不管系统是否发生故障,事务处理的结果都是永久的
  • 一旦事务被提交,事务的效果会被永久地保留在数据库中

事务的控制语句包括

  • begin或start transaction:显示的开启一个事务
  • commit;也可以使用commit work,不过二者是等价的。commit会提交事务,并使已对数据库进行的所有修改变为永久性的
  • rollback:又可以使用rollback work;不过二者是等价的。会滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
事务的实例
#在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。

#关闭自动提交
mysql> SET AUTOCOMMIT=0;

mysql>use auth; 
mysql>CREATE TABLE t5(id int(10),name char(20));
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;     //因为回滚所以数据没有插入
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值