• 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;
            }
    

      

  • 相关阅读:
    Android H5混合开发(5):封装Cordova View, 让Fragment、弹框、Activity自由使用Cordova
    机器学习 AI 谷歌ML Kit 与苹果Core ML
    Android 设备唯一标识(多种实现方案)
    Android自定义控件:图形报表的实现(折线图、曲线图、动态曲线图)(View与SurfaceView分别实现图表控件)
    Android 禁止截屏、录屏 — 解决PopupWindow无法禁止录屏问题
    Android原生PDF功能实现:PDF阅读、PDF页面跳转、PDF手势伸缩、PDF目录树、PDF预览缩略图
    某助手验证码通信交互包分析
    IOS弓箭传说的插件开发
    微店APP协议简要分析
    Owhat sign参数分析
  • 原文地址:https://www.cnblogs.com/jabbok/p/10070435.html
Copyright © 2020-2023  润新知