1. 程式人生 > 其它 >mysql索引和事務控制

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 開啟自動提交