zoukankan      html  css  js  c++  java
  • (三)事务和索引

    TCL语言

    transaction controller language 事务控制语言

    存储引擎

    INNODB MYISAM
    使用 默认使用 早些年使用
    事务支持 支持 不支持
    数据行锁定 支持 不支持(表锁定,效率低)
    外键约束 支持 不支持
    表空间的大小 较大 较小

    事务

    什么是事务

    事务就是用户定义的一系列数据库操作,这些操作可以视为一个逻辑处理工作单元,要么全部执行,要么全部不执行。

    事务使用步骤

    set autocommit=0;
    start transaction;【可选】
    .....
    commit/rollback;
    

    事务的四大特性

    ACID

    原子性:要么都做,要么都不做

    一致性:操作前后的状态是一致的

    持久性:

    1. 事务如果提交成功,持久化到数据库
    2. 事务没有提交成功,恢复到原状
    3. 事务一旦提交就不可逆了

    隔离性:多个用户不会互相影响

    事务的隔离级别

    演示隔离级别:视频

    脏读:一个事务A读取到另一个事务B未提交的数据,若另一个事务B回滚,则事务A读到脏数据

    不可重复读:没有脏读的情况,事务B未提交,事务A读到数据不变。但是B提交后,事务A再次读取,发现前后两次提交数据不一样。

    幻读:没有不可重复读,解决了更新时候的问题,但是插入或删除没有解决(B提交前后数据不一致)

    查看当前隔离级别
    mysql> select @@tx_isolation;
    +-----------------+
    | @@tx_isolation  |
    +-----------------+
    | REPEATABLE-READ |
    +-----------------+
    将当前会话设置成最低的隔离级别
    set session transaction isolation level read uncommitted;
     
    

    Mysql支持4种事务隔离级别,Mysql默认的事务隔离级别为repeatable read

    事务隔离级别 脏读 不可重复读 幻读
    read uncommitted
    read committed
    reaptable read
    serializable

    索引

    官网对索引的定义:index 是帮助mysql高效获取数据的数据结构

    讲索引的博客:https://blog.codinglabs.org/articles/theory-of-mysql-index.html

    索引的分类

    • 主键索引(primary key)
      • 唯一的标识,主键唯一且非空
    • 唯一索引(unique key)
      • 避免重复的列出现,一个表唯一索引可以有多个
    • 常规索引(key/index)
      • 默认的,index,key 关键字来设置
    • 全文索引(full_text)
      • 快速定位数据
    --查看一个表的所有索引
    SHOW INDEX FROM student
    --添加一个全文索引(注意括号里面不能用student.`StudentName`)
    ALTER TABLE `student` ADD FULLTEXT INDEX `fi_student_name`(`StudentName`);
    --全文索引
    EXPLAIN SELECT * FROM student WHERE MATCH(studentName) AGAINST('小');
    

    加100 0000数据

    DELIMITER $$ -- 写函数之前必须写
    CREATE FUNCTION mock_data()
    RETURNS INT
    BEGIN
       DECLARE num INT DEFAULT 1000000;
       DECLARE i INT DEFAULT 0;
       WHILE i<num DO
    	INSERT INTO app_user(`name`,`email`,`phone`,`gender`,`password`,`age`)
    	VALUES(
    	CONCAT('用户',i),'1014523451@163.com',
    	CONCAT('18', FLOOR(RAND()*(999999999-100000000)+100000000)),
    	FLOOR(RAND()*2),UUID(),FLOOR(RAND()*100)
    	);
    	SET i=i+1;
       END WHILE;
       RETURN i;
    END;
    SELECT mock_data()
    
    CREATE INDEX id_app_user_name ON app_user(`name`);
    

    image-20200613211641357

    索引原则

    1. 索引在小数据量不明显,在大的数据量明显

    2. 索引不是越多越好

    3. 索引一般加在常用来查询的字段上

  • 相关阅读:
    使用 Jackson – 将字符串转换为 JsonNode 对象
    Java 8 及其后续版本的新遍历 forEach
    IntelliJ IDEA 快速插入 for 循环
    在 Discourse 中如何使用输入对话框
    如何修改 Discourse 的域名
    Confluence 数据中心版本接近生命周期了
    IntelliJ IDEA 中如何将 POM 中的版本号快速提出为属性
    RedHat 8 如何检查端口是否联通
    二、RabbitMq安装
    一、RabbitMQ 的概念
  • 原文地址:https://www.cnblogs.com/10134dz/p/13873274.html
Copyright © 2011-2022 走看看