zoukankan      html  css  js  c++  java
  • 每天一分钟,了解mysql索引,事务与存储引擎

    一、索引的概念

    1、是一个排序的列表,存储着索引值和这个值对应的物理地址,相当于一本书的目录

    2、无须对这个表进行扫描,通过物理地址就可以找到所需数据

    3、是表中一列或者若干列值排序的方法

    4、无需额外的磁盘空间

    二、索引的作用

    1、建立了合适的索引之后,数据库利用各种快速定位技术,可以大大加快数据查询速度,这也是创建索引最主要的原因

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

    3、可以降低数据库的IO成本,并且还可以降低数据库的排序成本

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

    5、可以加快表和表之间的连接

    6、在使用分组和排序子句进行数据查询时,可以显著减少查询中分组和排序时间

    三、索引的分类

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

    创建方式

    ①:创建表结构时创建

    mysql> create table yjs(yjs_name char(16) not null,id varchar(48) not nullull,primary key (yjs_name),index index_id (id));
    Query OK, 0 rows affected (0.01 sec)
    mysql> show index from yjs;    #查看索引
    +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
    | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
    +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
    | yjs   |          0 | PRIMARY  |            1 | yjs_name    | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
    | yjs   |          1 | index_id |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
    +-------+------------+----------+--------------+-------------+---------  

    ②:直接创建索引

    mysql> create index index_sex on ky(sex);
    Query OK, 0 rows affected (0.01 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    show index from ky;   #查看索引  

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

    mysql> alter table ky add unique index_id(id);
    Query OK, 0 rows affected (0.01 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    show index from ky;
    

    2、唯一性索引

    与普通索引基本相同,但有一个区别:索引列的所有值只能出现一次,即必须唯一。

    创建索引的方式

    ①:直接创建索引

    mysql> insert into user(id,name,age,sex) values(1,'lili',20,'女'),(2,'sisi',21,'女'),(3,'qiqi',25,'男');
    mysql> create unique index index_name on user(name);
    mysql> show index from user;#查看索引

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

    mysql> alter table user add unique index_id(id);
    mysql> show index from user;
    

    3、主键索引

    ①、是一种特殊的唯一索引,指定‘primary 可以’

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

    创建主键索引的方式

    mysql> create table user(id char(16) not null,name char(48) not null,agee int(4) not null,primary key (id));
    

    4、查看索引的方式

    1 mysql> show index from 表名;
    2 mysql> show keys from 表名;

    5、删除索引

    1 mysql> drop index 索引名 on 表名;
    2 mysql> alter table index 表名 drop index 索引名;

    6、组合索引

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

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

    创建组合索引的方式

    mysql> create table users(name varchar(9), age int(3),sex tinyint(1),index users(name,age,sex));
    mysql> show index from users;
    

    7、全文索引

    ①、Mysql 从3.23.23版开始支持全文索引和全文检索

    ②、索引类型为FULLTEXT

    ③、可以在CHAR/VARCHAR或者TEXT类型的列上创建

    直接创建索引

    mysql> create index index_age on users(age);
    mysql> show index from users;#查看索引  

     修改表结构方式添加索引

    1 mysql> alter table users add index index_age(age);
    2 mysql> show index from users;
    

    8、两张表之间建立内联

    mysql> create table auth1(id int(16) not null auto_increment,name varchar(48) not null,score int(48) not null,hobby int(16) not null,primary key (id));
    mysql> insert into auth1(id,name,score,hobby) values(1,'lili',70,2),(2,'sisi',71,3),(3,'qiqi',80,2);
    mysql> select * from auth1;
    +----+------+-------+-------+
    | id | name | score | hobby |
    +----+------+-------+-------+
    |  1 | lili |    70 |     2 |
    |  2 | sisi |    71 |     3 |
    |  3 | qiqi |    80 |     2 |
    +----+------+-------+-------+
    3 rows in set (0.00 sec)
    
    mysql> create table auth2(id int(16) primary key,hob_name char(48) not null);
    mysql> insert into auth2(id,hob_name) values(1,'看书'),(2,'聊天'),(3,' 吃饭');
    mysql> select * from auth2;
    +----+----------+
    | id | hob_name |
    +----+----------+
    |  1 | 看书     |
    |  2 | 聊天     |
    |  3 | 吃饭     |
    +----+----------+
    3 rows in set (0.00 sec)
    mysql> select * from auth1 inner join auth2 on auth1.hobby=auth2.id;
    +----+------+-------+-------+----+----------+
    | id | name | score | hobby | id | hob_name |
    +----+------+-------+-------+----+----------+
    |  1 | lili |    70 |     2 |  2 | 聊天     |
    |  3 | qiqi |    80 |     2 |  2 | 聊天     |
    |  2 | sisi |    71 |     3 |  3 | 吃饭     |
    +----+------+-------+-------+----+----------+
    3 rows in set (0.00 sec)
    mysql> select auth1.name,auth2.hob_name from auth1 inner join auth2 on auth1.hobby=auth2.id;
    +------+----------+
    | name | hob_name |
    +------+----------+
    | lili | 聊天     |
    | qiqi | 聊天     |
    | sisi | 吃饭     |
    +------+----------+
    3 rows in set (0.00 sec)  

    建立索引视图,相当于软链接

    mysql> create view view_user as select u.name,h.hob_name from user1 u inner join hob h on u.hobby=h.id;        #创建试图,view_user是视图名
    mysql> select * from view_user;
    mysql> insert into user1(id,name,score,hobby) values(4,'wangwu',69,2);       #后续添加的内容会显示在试图中
    mysql> select * from view_user;
    

      

     四、创建索引的原则依据

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

    2、记录超过300行的表应该有索引

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

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

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

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

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

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

    五、事务的概念

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

    2、是一个不可分隔的工作逻辑单元,在数据库系统上执行并发操作时,事务时最小的控制单元

    3、适用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等等

    4、通过事务的整体性以保证数据的一致性

    5、事务的特点:

    5.1、原子性

    ①事务是一个完整的操作,事务的个元素是不可分的

    ②事务中的所有元素必须作为一个整体提交或回滚

    ③如果事务中的任何元素失败,则整个事务将失败

    5.2、一致性

    ①当事务完成时,数据必须处于一致状态

    ②在事务开始前,数据库中存储的数据处于一致状态

    ③在正在进行的事务中,数据可能处于不一致的状态

    ④当事务成功完成时,数据必须再次回到已知的一致状态

    5.3、隔离性

    ①对数据进行修改的所有并发事务是彼此隔离的,表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务

    ②修改数据的事务可在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据

    5.4、持久性

    ①指不管系统是否发生故障,事务处理的结果都是永久的

    ②一旦事务被提交,事务的效果会被永久地保留在数据库中

    6、事务控制语句

    1、MySQL事务默认是自动提交的,当SQL语句提交时事务便自动提交

    2、事务控制语句

    BEGIN或START TRANSACTION
    COMMIT
    ROLLBACK
    SAVEPOINT identifier
    RELEASE SAVEPOINT identifier
    ROLLBACK TO identifier
    SET TRANSACTION
    

    7、事务的控制方法  

     1、事务处理命令控制事务

    BEGIN:开始一个事务
    COMMIT:提交一个事务
    ROLLBACK:回滚一个事务
    

    2、使用set命令进行控制

    set autocommit=0:禁止自动提交
    set autocommit=1:开启自动提交
    

    8、事务的操作

    mysql> begin;         #开始事务
    mysql> insert into userq1(id,name,score,hobby) values(5,'yy',80,2);
    mysql> rollback;      #回滚
    mysql> commit;        #提交  

    六、存储引擎概念介绍

    1、MySQL中的数据用各种不同的技术存储文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎

    2、存储引擎时MySQL将数据存储在文件系统中的存储方式或者存储格式

    3、MySQL常用的存储引擎

     1 MyISAM

     2 InnoDB

    4、MySQL数据库中的组件,负责执行实际的数据I/O操作

    5、MySQL系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储

    八、mylsam的介绍

    1、MyISAM不支持事务,也不支持外键

    2、访问速度快

    3、对事务完整性没有要求

    4、MyISAM在磁盘上存储成三个文件

    .frm文件存储表定义
    数据文件的扩展名为.MYD(MYDATA)
    索引文件的扩展名是.MYI(MYIndex)
    

    5、表级锁定形式,数据在更新时锁定整个表

    6、数据库在读写过程中相互阻塞

    6.1、会在数据写入的过程阻塞用户数据的读取

    6.2、也会在数据读取的过程中阻塞用户的数据写入

    7、数据单独写入或读取,速度过程较快且占用资源相对少

    8、MyISAM支持的存储格式

    8.1、静态表

    8.2、动态表

    8.3、压缩表

    9、MyISAM适用的生产场景举例

    9.1、公司业务不需要事务的支持

    9.2、单方面读取或写入数据比较多的业务

    9.3、MyISAM存储引擎数据读写都比较频繁场景不适合

    9.4、使用读写并发访问相对较低的业务

    9.5、数据修改相对较少的业务

    9.6、对数据业务一致性要求不是非常高的业务

    9.7、服务器硬件资源相对比较差

    八、InnoDB的介绍

    1、InnoDB特点介绍

    1.1、支持4个事务隔离级别

    1.2、行级锁定,但是全表扫描仍然会是表级锁定

    1.3、读写阻塞与事务隔离级别相关

    1.4、能非常高效的缓存索引和数据

    1.5、表与主键以簇的方式存储

    1.6、支持分区、表空间、类似Oracle数据库

    1.7、支持外键约束,5.5前不支持全文索引,5.5后支持全文索引

    1.8、对硬件资源要求还是比较高的场合

    2、InnoDB适用生产场景分析

    2.1、业务需要事务的支持

    2.2、行级锁定对高并发有很好的适用能力,但需要确保查询是通过索引来完成

    2.3、业务数据更新较为频繁的场景,如:论坛,微博等

    2.4、业务数据一致性要求较高,如:银行业务

    2.5、硬件设备内存较大,利用InnoDB较好的缓存能力来提高内存利用率,减少磁盘IO的压力

    3、企业选择存储引擎依据

    3.1、需要考虑每个存储引擎提供的核心功能及应用场景

    3.2、支持的字段和数据类型

    ①所有引擎都支持通用的数据类型

    ②但不是所有的引擎都支持其它的字段类型,如二进制对象

    3.3、锁定类型:不同的存储引擎支持不同级别的锁定

    ①表锁定

    ②行锁定

    3.4、索引的支持

    ①建立索引在搜索和恢复数据库中的数据时能显著提高性能

    ②不同的存储引擎提供不同的制作索引的技术

    ③有些存储引擎根本不支持索引

    3.5、事务处理的支持

    ①提高在向表中更新和插入信息期间的可靠性

    ②可根据企业业务是否要支持事务选择存储引擎

    4、修改存储引擎 

    方法一:alter table修改
    mysql> alter table 库名 engine=MyISAM;
    方法二:修改my.cnf配置文件,指定默认存储引擎并重启服务
    vim my.cnf
    default-storage-engine=InnoDB
    方法三:create table创建表时指定存储引擎
    mysql> create table engine Test(id int) engine=MyISAM;
    

      

     

        

      

  • 相关阅读:
    Java & PHP RSA 互通密钥、签名、验签、加密、解密
    Spring Cloud:Security OAuth2 自定义异常响应
    Spring Cloud:统一异常处理
    Spring Cloud:多环境配置、eureka 安全认证、容器宿主机IP注册
    Hexo + GitEE 搭建、备份、恢复、多终端
    Spring:AOP面向切面编程
    如何找到适合自己的文档工具?
    比较好玩的工具类合集推荐!!!
    C++11 如何使代码仅执行一次?
    CMake 常用操作有哪些?
  • 原文地址:https://www.cnblogs.com/tianzhendengni/p/13857469.html
Copyright © 2011-2022 走看看