mysql索引和事务控制

介绍

  • 加快查询速度

  • 减低数据库的io成本

  • 加快表与表的连接

  • 减少分组的排列时间

  • 原理依据:

    • 表的主键,外键必须有索引
    • 数量超过300行的表应该有索引
    • 经常与其他表连接
    • 唯一性太差的不适合当索引
    • 经常出现在where上的字段,应该建立索引
  • 影响:在表中有大量数据的前提下,创建索引速度会很慢
    在索引创建完毕后,对表的查询性能会发幅度提升,但是写性能会降低

分类

  vim /etc/my.cnf
  default-cahracter-set=utf8
  systemctl restat mariadb
  mysql
  create database imployee_salary default charset utf8;
  use imployee_salary;
  create table IT_salary (岗位类别 char(20) not null, 姓名 char(20) not null, 年龄 int, 员工ID int not null, 学历 char(6), 年限 int, 薪资 int, primary key(员工ID));
  insert into IT_salary(岗位类别,姓名,年龄,员工ID,学历,年限,薪资) values('Windows工程师','蓝凌',19,012,'中专',2,3500);
  insert into IT_salary(岗位类别,姓名,年龄,员工ID,学历,年限,薪资) values('Linux工程师','姜纹',32,013,'本科',8,15000);
  insert into IT_salary(岗位类别,姓名,年龄,员工ID,学历,年限,薪资) values('Java软件工程师','关园',38,014,'大专',10,16000);
  insert into IT_salary(岗位类别,姓名,年龄,员工ID,学历,年限,薪资) values('硬件驱动工程师','罗中昆',29,015,'大专',9,16500);
  • 普通索引:没有唯一性的限制
    格式:create index <索引名字> on 表名<字段>

    create index salary_index on IT_salary(薪资);
    MariaDB [imployee_salary]> show index from IT_salary\G;
    *************************** 2. row ***************************
            Table: IT_salary
     Non_unique: 1
       Key_name: salary_index
     Seq_in_index: 1
      Column_name: 薪资
        Collation: A
      Cardinality: 4
         Sub_part: NULL
           Packed: NULL
             Null: YES
       Index_type: BTREE
        Comment: 
    Index_comment: 
    
  • 唯一性索引:所有列的所有值只能出现一次
    格式:create unique index <索引名字> on 表名(字段);

    create unique index salary_unique_index on IT_salary(姓名);
    show index from IT_salary\G;
    *************************** 3. row ***************************
            Table: IT_salary
       Non_unique: 1
         Key_name: salary_index
     Seq_in_index: 1
      Column_name: 薪资
        Collation: A
      Cardinality: 4
         Sub_part: NULL
           Packed: NULL
             Null: YES
       Index_type: BTREE
          Comment: 
    Index_comment: 
    
  • 主键:特殊的唯一性索引,必须指定为“PRIMARY KEY”,具有唯一性的同时不能为空
    格式:create yable 表名(...), primary key(字段);
    alter table 表名 add primary key(字段);

    create table IT_salary (岗位类别 char(20) not null, 姓名 char(20) not null, 年龄 int, 员工ID int not null, 学历 char(6), 年限 int, 薪资 int, primary key(员工ID));
    alter table IT_salary add primary key(员工ID);
    *************************** 1. row ***************************
            Table: IT_salary
       Non_unique: 0
         Key_name: PRIMARY
     Seq_in_index: 1
      Column_name: 员工ID
        Collation: A
      Cardinality: 4
         Sub_part: NULL
           Packed: NULL
             Null: 
       Index_type: BTREE
          Comment: 
    Index_comment: 
    
  • 全文索引:类型为FULLTEXT,可以在VARCHARvarchar ((N)中的N指的是该字段最多能存储多少个字符,任何都可以称之为字符)或者TEXT(用于存储可以从1字节到4GB长度的文本字符串)类型上创建,小型网站上

  • 删除索引
    格式:drop index <索引名称> on 表名;
    alter table 表名 drop index<索引名称>;
    alter table 表名 drop primary key;

    drop index salary_index on IT_salary;
    alter table IT_salary drop index salary_unipue_index;
    show kets from IT_salary;
    
  • 单列索引与多列索引:字面意思

数据库事务

  • 事务是一种机制,一个操作序列,一个不可分割的工作逻辑单元,最小的控制单元
  • 原子性(atomictry):是一个完整的操作,不可分割。
  • 一致性(consistency):事务开始前结束后,数据处于一致状态,过程中可不处于一致状态
  • 隔离性(lsolation):对数据修改的所有事务都是彼此隔离的
  • 持久性(duracility):一旦事务提交,就会永久保留在数据库中

事务的操作

默认情况下mysql的事务是自动提交的。

  • 事务处理命令控制
    begin(开始一个事务),commit(提交一个事务),rollback(回滚一个事务(撤销))
    mysql事务操作必须基于innodb存储引擎
    create databases auth;
    use auth;
    create table users(name char(20),age int,primary key(name)) engine=innodb
    begin
    insert into users values('lisi'.'123123');
    commit
    
  • 使用set命令控制
    set autocommit=0 禁止自动提交
    set autocommit=1 开启自动提交
posted @ 2021-10-14 19:02  whml  阅读(68)  评论(0编辑  收藏  举报