日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL-体系结构以及常用存储引擎MyISAM和InnoDB初探

發布時間:2025/3/21 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL-体系结构以及常用存储引擎MyISAM和InnoDB初探 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 生猛干貨
  • 官方文檔
  • MySQL體系結構
  • 常用存儲引擎之MyISAM
    • MyISAM的組成
    • MyISAM的特征
    • MyISAM的限制
    • MyISAM的適用場景
  • 常用存儲引擎之Innodb
    • Innodb的特征
    • innodb 狀態檢查
    • 適用場景
  • 多種存儲引擎小結
  • 搞定MySQL

生猛干貨

帶你搞定MySQL實戰,輕松對應海量業務處理及高并發需求,從容應對大場面試


官方文檔

https://dev.mysql.com/doc/

如果英文不好的話,可以參考 searchdoc 翻譯的中文版本

http://www.searchdoc.cn/rdbms/mysql/dev.mysql.com/doc/refman/5.7/en/index.com.coder114.cn.html


MySQL體系結構

一個SQL的執行過程:

  • 客戶端/服務端通信;

  • 查詢緩存;

  • 查詢優化處理;

  • 調用查詢存儲引擎;

  • 返回客戶端結果集;

  • 簡單了解Mysql 體系結構,MYSQL是如何執行一條SQL的


    MySQL區別于其他數據庫最主要的特點是: 插件式存儲引擎 。

    比較常見的存儲引擎: innodb 、myisam、XtraDB、CSV、Memory、MRG_MYISAM、archive 、federated 、tokudb等

    存儲引擎是針對表的而不是針對庫的,功能上支持 不同的表使用不同的存儲引擎,但非常不建議這么做。


    常用存儲引擎之MyISAM

    MySQL5.5之前默認的 存儲引擎。

    MyISAM的組成

    MYD (數據文件) + MYI(索引文件)

    創建一個表t_myisam, 存儲引擎使用 MyISAM ( engine=myisam)

    [root@artisan ~]# mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 37 Server version: 5.7.29-log MySQL Community Server (GPL)

    mysql> mysql> use artisan; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -ADatabase changed mysql> create table t_myisam(id int,c1 varchar(10)) engine=myisam; # 指定存儲引擎為 myisam Query OK, 0 rows affected (0.00 sec) mysql>

    看下磁盤上存儲

    MYD和MYI是MyISAM存儲引擎特有的文件。

    另外還有個frm結尾的文件,并不是MyISAM存儲引擎特有的,對于MySQL數據庫,是通用的,用來記錄表結構等信息的。


    MyISAM的特征

    • 表級鎖 ,并發性比較差

    • 表損壞修復 ,可以通過 check table tablename 來檢查, 使用 repair table tablename 來修復 . 另外mysql還提供了命令行來修復,但最好需要停庫。

      mysql> check table t_myisam;+------------------+-------+----------+----------+| Table | Op | Msg_type | Msg_text |+------------------+-------+----------+----------+| artisan.t_myisam | check | status | OK |+------------------+-------+----------+----------+1 row in set (0.32 sec)mysql> repair table t_myisam;+------------------+--------+----------+----------+| Table | Op | Msg_type | Msg_text |+------------------+--------+----------+----------+| artisan.t_myisam | repair | status | OK |+------------------+--------+----------+----------+1 row in set (0.04 sec
    • 支持的索引: 全文索引 、text blob 前綴索引

    • 支持數據壓縮 命令行: myisampack

    • 不支持事務

      [root@artisan artisan]# myisampack -b -f t_myisam.MYI


    MyISAM的限制

    • 版本<MySQL5.0 默認表大小為4G,如果要存儲大表則需要修改Max_Rows 和 Avg_Row_Length
    • 版本> MySQL5.0 默認支持為256TB

    MyISAM的適用場景

    • 非事務型應用
    • 只讀類應用
    • 空間類應用。 5.7以前 MyISAM是唯一支持空間函數的存儲引擎

    常用存儲引擎之Innodb

    MySQL5.5之后默認的 存儲引擎。

    Innodb的特征

    • 使用表空間儲存數據
      innodb_file_per_table參數決定 ,ON :存儲在獨立的表空間 tablename.ibd ; OFF :系統表空間 ibdataX (X代表數字)

      mysql> show variables like 'innodb_file_per_table'; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | innodb_file_per_table | ON | +-----------------------+-------+ 1 row in set (0.00 sec)mysql>

      如果關閉呢,看下如何存儲的

      mysql> set global innodb_file_per_table = off; Query OK, 0 rows affected (0.00 sec)mysql> show variables like 'innodb_file_per_table'; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | innodb_file_per_table | OFF | +-----------------------+-------+ 1 row in set (0.01 sec)mysql>


      那該如何選擇呢?
      1) 系統表空間無法簡單的收縮,獨立的表空間可以通過optimize table明林收縮系統文件
      2)系統表空間,多個表順序寫入,會產生I/O瓶頸。獨立表空間可以同時向多個文件刷新數據

      對Innodb使用獨立表空間,并且5.6版本以后的MYSQL默認使用獨立表空間

    如果原來存在系統表空間中,要遷移到獨立表空間呢?

  • 使用mysqldump導出所有的數據庫表數據
  • 停止MySQL服務,修改參數,并刪除Innodb相關文件
  • 重啟MySQL服務,重建Innodb系統表空間
  • 導入數據
    • 支持事務 (依靠Redo Log【負責持久性】 和 Undo Log 【負責回滾】)

      Redo Log 存儲已提交的數據
      UndoLog 存儲未提交的數據

      Redo log的大小設置

      mysql> show variables like 'innodb_log_buffer_size'; +------------------------+----------+ | Variable_name | Value | +------------------------+----------+ | innodb_log_buffer_size | 16777216 | +------------------------+----------+ 1 row in set (0.00 sec)mysql>

      這個參數不用太大,1秒提交一次 。

      另外一個參數

    mysql> show variables like 'innodb_log_files_in_group'; +---------------------------+-------+ | Variable_name | Value | +---------------------------+-------+ | innodb_log_files_in_group | 2 | +---------------------------+-------+ 1 row in set (0.00 sec)

    看到參數為2 , 所以 有2個文件

    • 行級鎖 ,可以支持最大程度的并發。 行級鎖由存儲引擎實現的。

      1)鎖主要用來管理共享資源的并發訪問。
      2)鎖用于實現事務的隔離性

      鎖的類型

      • 共享鎖 (也稱為讀鎖)
      • 獨占鎖 (也稱為寫鎖)

      鎖的粒度

      • 表級鎖

      來演示下

      會話一:

      mysql> use artisan; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -ADatabase changedmysql> show create table t_innodb; # 查看建表語句 +----------+--------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +----------+--------------------------------------------------------------------------------------------------------------------------------+ | t_innodb | CREATE TABLE `t_innodb` (`id` int(11) DEFAULT NULL,`c1` varchar(10) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 | +----------+--------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)mysql> insert into t_innodb values(1,'aa'),(2,'bb'); # 寫入2條數據 Query OK, 2 rows affected (0.01 sec) Records: 2 Duplicates: 0 Warnings: 0mysql> select * from t_innodb; +------+------+ | id | c1 | +------+------+ | 1 | aa | | 2 | bb | +------+------+ 2 rows in set (0.00 sec)mysql> lock table t_innodb write; # 加表級鎖 Query OK, 0 rows affected (0.00 sec)mysql>

      會話二

      緊接著,這個Select 馬上就出來結果了

    • 行級鎖 , 存儲引擎實現的,并不是MySQL實現的


    innodb 狀態檢查

    命令: show engine innodb status;

    mysql> pager more; # 設置多頁展示 PAGER set to 'more' mysql> show engine innodb status\G ; # \G 格式化查看 *************************** 1. row ***************************Type: InnoDBName: Status: ===================================== 2020-01-30 15:26:27 0x7fbe901e8700 INNODB MONITOR OUTPUT ===================================== Per second averages calculated from the last 6 seconds ----------------- BACKGROUND THREAD ----------------- srv_master_thread loops: 32 srv_active, 0 srv_shutdown, 166260 srv_idle srv_master_thread log flush and writes: 166292 ---------- SEMAPHORES ---------- OS WAIT ARRAY INFO: reservation count 40 OS WAIT ARRAY INFO: signal count 40 RW-shared spins 0, rounds 83, OS waits 39 RW-excl spins 0, rounds 0, OS waits 0 RW-sx spins 0, rounds 0, OS waits 0 Spin rounds per wait: 83.00 RW-shared, 0.00 RW-excl, 0.00 RW-sx ------------ TRANSACTIONS ------------ Trx id counter 109372 Purge done for trx's n:o < 109372 undo n:o < 0 state: running but idle History list length 15 LIST OF TRANSACTIONS FOR EACH SESSION: ---TRANSACTION 421931820292832, not started 0 lock struct(s), heap size 1136, 0 row lock(s) ---TRANSACTION 421931820291920, not started 0 lock struct(s), heap size 1136, 0 row lock(s) -------- FILE I/O -------- I/O thread 0 state: waiting for completed aio requests (insert buffer thread) I/O thread 1 state: waiting for completed aio requests (log thread) --More--

    適用場景

    • 適用大多數OLTP應用
    • 5.7以后 支持全文索引和 空間函數

    多種存儲引擎小結


    搞定MySQL

    總結

    以上是生活随笔為你收集整理的MySQL-体系结构以及常用存储引擎MyISAM和InnoDB初探的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。