zoukankan      html  css  js  c++  java
  • mysql_innodb引擎

    innodb概括

    1、Innodb是一种事务性存储引擎
    2、完全支持事务的ACID特性
    3、实现事务特性的原理:
        使用Redo Log和Undo Log,Undo Log用于帮助未提交事务进行回滚,Redo Log记录
        已经提交的事务,Undo Log会随机读写,而Redo Log基本是顺序
    4、Innodb支持的是行级锁,在进行写操作时需要的资源更少,支持的并发更多
    5、行级锁是由存储引擎层实现的
    6、锁:
        锁的主要租用是管理共享资源的并发访问
        锁用于实现事务的隔离性
        共享锁(读锁)
        独占锁(写锁)
        锁的粒度:根据粒度分为表级锁,行级锁,粒度越大,并发就越小
    7、阻塞和死锁:
        阻塞:一个事务中的锁需要等待另一个事务中的锁释放,形成的是阻塞
        死锁:两个或两个以上的事务在执行中相互占用了对方的资源
    8、Innodb状态检查:
        show engine innodb status;
    --------------------- 
    原文:https://blog.csdn.net/qq_28893679/article/details/78283102 
    

      

    查看当前支持的引擎

    mariadb> show engines;
    +--------------------+---------+----------------------------------------------------------------------------+--------------+-----+------------+
    | Engine             | Support | Comment                                                                    | Transactions | XA  | Savepoints |
    +--------------------+---------+----------------------------------------------------------------------------+--------------+-----+------------+
    | CSV                | YES     | CSV storage engine                                                         | NO           | NO  | NO         |
    | MRG_MYISAM         | YES     | Collection of identical MyISAM tables                                      | NO           | NO  | NO         |
    | MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables                  | NO           | NO  | NO         |
    | BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears)             | NO           | NO  | NO         |
    | MyISAM             | YES     | MyISAM storage engine                                                      | NO           | NO  | NO         |
    | InnoDB             | DEFAULT | Percona-XtraDB, Supports transactions, row-level locking, and foreign keys | YES          | YES | YES        |
    | ARCHIVE            | YES     | Archive storage engine                                                     | NO           | NO  | NO         |
    | FEDERATED          | YES     | FederatedX pluggable storage engine                                        | YES          | NO  | YES        |
    | PERFORMANCE_SCHEMA | YES     | Performance Schema                                                         | NO           | NO  | NO         |
    | Aria               | YES     | Crash-safe tables with MyISAM heritage                                     | NO           | NO  | NO         |
    +--------------------+---------+----------------------------------------------------------------------------+--------------+-----+------------+
    10 rows in set
    #最常用的是innodb和MyISAM
    #可见,默认引擎是innodb
    

      

    查看表引擎

    引擎是表级别的,在创建表的时候,可以设定engine=innodb或者其他引擎。如果不设定,就按服务的默认引擎来。

    mariadb> show create table history;
    +---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Table   | Create Table                                                                                                                                                                                                                                                         |
    +---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | history | CREATE TABLE `history` (
      `itemid` bigint(20) unsigned NOT NULL,
      `clock` int(11) NOT NULL DEFAULT '0',
      `value` double(16,4) NOT NULL DEFAULT '0.0000',
      `ns` int(11) NOT NULL DEFAULT '0',
      KEY `history_1` (`itemid`,`clock`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
    +---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set
    

      

    innodb支持事务

    从下面的数据中可以发现,表使用innodb引擎比使用mysiam引擎,数据量要大得多。innodb支持事务,mysiam不支持事务。

    mysql> use config;
    Database changed
    
    mysql> create table size_test engine=myisam as select * from SvrConfig;
    Query OK, 672 rows affected (0.01 sec)
    Records: 672  Duplicates: 0  Warnings: 0
    
    mysql> use information_schema 
    Database changed
    
    mysql> select concat(round(sum(DATA_LENGTH/1024/1024),2),'MB')as data from TABLES where table_schema='config' and table_name='size_test';
    +--------+
    | data   |
    +--------+
    | 0.13MB |
    +--------+
    1 row in set (0.00 sec)
    
    mysql> alter table config.size_test engine=innodb;
    Query OK, 672 rows affected (0.06 sec)
    Records: 672  Duplicates: 0  Warnings: 0
    
    mysql> select concat(round(sum(DATA_LENGTH/1024/1024),2),'MB')as data from TABLES where table_schema='config' and table_name='size_test';
    +--------+
    | data   |
    +--------+
    | 0.20MB |
    +--------+
    1 row in set (0.00 sec)
    

    innodb存储性能  

    innodb是高性能的存储引擎,是企业核心数据库的首先,很多大型企业的mysql采用innodb,并在innodb表中存储超过1TB的数据,并发写操作超过800次/s。

    innodb支持行级锁

     行级锁分为共享锁和排它锁

    共享锁

    又叫读锁,加上共享锁之后,事务对行只能进行读操作而不能写操作。

    事务结束则锁释放,未释放前不能再加其他锁。

    其他事务要操作,就要共享这把锁,然后也只能进行读操作。

    SELECT `id` FROM  table WHERE id in(1,2)   LOCK IN SHARE MODE 
    #结果集的数据都会加共享锁
    

      

    排它锁

    某个事务对某行加上锁,就只有这个事务可以写。其他事务可以读,不能写。这样就保证写入数据的一致性。

    <?php
            $uid=$_SESSION['uid'];
            //开启事务
            sql:begin
            //开启行级锁的排他锁
            sql:SELECT `coin` FROM user WHERE id=$uid FOR UPDATE 
            //扣除用户账户钱币
            $res=update user set coin=coin-value where id=1;
            if($res){
                //将用户的提现信息添加到提现表
                sql:insert into user values(null,"{$uid}",value);
                //判断添加结果
                if(add_cash_result){
                    sql:commit
                }else{
                    sql:rollback
                }
            }else{
                sql:rollback;
            }
    

      

  • 相关阅读:
    leetcode Remove Linked List Elements
    leetcode Word Pattern
    leetcode Isomorphic Strings
    leetcode Valid Parentheses
    leetcode Remove Nth Node From End of List
    leetcode Contains Duplicate II
    leetcode Rectangle Area
    leetcode Length of Last Word
    leetcode Valid Sudoku
    leetcode Reverse Bits
  • 原文地址:https://www.cnblogs.com/jabbok/p/10070435.html
Copyright © 2011-2022 走看看