mysql數據庫壓縮表空間(數據庫壓縮存儲)

本文目錄一覽:

怎麼修改mysql數據庫臨時表空間大小

以MySQL 8.0 來說,通過查看 8.0 的官方文檔得知,8.0 的臨時表空間分為會話臨時表空間和全局臨時表空間,會話臨時表空間存儲用戶創建的臨時表和當 InnoDB 配置為磁盤內部臨時表的存儲引擎時由優化器創建的內部臨時表,當會話斷開連接時,其臨時表空間將被截斷並釋放回池中;也就是說,在 8.0 中有一個專門的會話臨時表空間,當會話被殺掉後,可以回收磁盤空間;而原來的 ibtmp1 是現在的全局臨時表空間,存放的是對用戶創建的臨時表進行更改的回滾段,在 5.7 中 ibtmp1 存放的是用戶創建的臨時表和磁盤內部臨時表;

也就是在 8.0 和 5.7 中 ibtmp1 的用途發生了變化,5.7 版本臨時表的數據存放在 ibtmp1 中,在 8.0 版本中臨時表的數據存放在會話臨時表空間,如果臨時表發生更改,更改的 undo 數據存放在 ibtmp1 中;

實驗驗證:將之前的查詢結果保存成臨時表,對應會話是 45 號,通過查看對應字典表,可知 45 號會話使用了 temp_8.ibt 這個表空間,通過把查詢保存成臨時表,可以用到會話臨時表空間,如下圖:

下一步殺掉 45 號會話,發現 temp_8.ibt 空間釋放了,變為了初始大小,狀態為非活動的,證明在 mysql8.0 中可以通過殺掉會話來釋放臨時表空間。

總結:在 mysql5.7 時,殺掉會話,臨時表會釋放,但是僅僅是在 ibtmp 文件里標記一下,空間是不會釋放回操作系統的。如果要釋放空間,需要重啟數據庫;在 mysql8.0 中可以通過殺掉會話來釋放臨時表空間。

MYSQL表壓縮和整理

提高表查詢的效率最好的辦法是添加所有,不要怕冗餘數據。

比如,一個表就一列name。存的是英文名字有兩千萬條數據。

如果直接查一個名字會很慢,這樣我們就可以建冗餘列,比如number字數列,和head_letters第一個字母列。

這樣我們就可以建立多行索引(這裡就不集體說怎麼寫了)。

在查表的時候就可以通過number和head_letters和name。三個添加查詢。

這樣就可以提高查詢效率。

linux怎麼修改mysql數據庫臨時表空間大小

先來說說臨時表的概念。 臨時表顧名思義,就是臨時的,用完銷毀掉的表。 數據既可以保存在臨時的文件系統上,也可以保存在固定的磁盤文件系統上。 臨時表有下面幾種:

1全局臨時表

這種臨時表從數據庫實例啟動後開始生效,在數據庫實例銷毀後失效。在MySQL裡面這種臨時表對應的是內存表,即memory引擎。

2會話級別臨時表

這種臨時表在用戶登錄系統成功後生效,在用戶退出時失效。在MySQL里的臨時表指的就是以 create temporary table 這樣的關鍵詞創建的表。

3事務級別臨時表

這種臨時表在事務開始時生效,事務提交或者回滾後失效。 在MySQL裡面沒有這種臨時表,必須利用會話級別的臨時表間接實現。

4檢索級別臨時表

這種臨時表在SQL語句執行之間產生,執行完畢後失效。 在MySQL裡面這種臨時表不是很固定,跟隨MySQL默認存儲引擎來變化。比如默認存儲引擎是MyISAM,臨時表的引擎就是MyISAM,並且文件生成形式以及數據運作形式和MyISAM一樣,只是數據保存在內存里;如果默認引擎是INNODB,那麼臨時表的引擎就是INNODB,此時它的所有信息都保存在共享表空間ibdata裡面。

MySQL 5.7對於InnoDB存儲引擎的臨時表空間做了優化。在MySQL 5.7之前,INNODB引擎的臨時表都保存在ibdata裡面,而ibdata的貪婪式磁盤佔用導致臨時表的創建與刪除對其他正常表產生非常大的性能影響。在MySQL5.7中,對於臨時表做了下面兩個重要方面的優化:

MySQL5.7 把臨時表的數據以及回滾信息(僅限於未壓縮表)從共享表空間裡面剝離出來,形成自己單獨的表空間,參數為innodb_temp_data_file_path。

在MySQL5.7 中把臨時表的相關檢索信息保存在系統信息表中:information_schema.innodb_temp_table_info. 而MySQL 5.7之前的版本想要查看臨時表的系統信息是沒有太好的辦法。

需要注意的一點就是,雖然INNODB臨時表有自己的表空間,但是目前還不能自己定義臨時表空間文件的保存路徑,只能是繼承innodb_data_home_dir。此時如果想要拿其他的磁盤,比如內存盤來充當臨時表空間的保存地址,只能用老辦法,做軟鏈。舉個小例子:

我現在用的OS是 Ubuntu12.X,想用tmpfs文件系統充當臨時表空間,

root@ytt-master-VirtualBox:/usr/local/mysql/data# ln -s/run/shm/ /usr/local/mysql/data/tmp_space2

root@ytt-master-VirtualBox:/usr/local/mysql/data#ls -l | grep ‘shm’

lrwxrwxrwx1 root root 9 Nov 13 10:28tmp_space2 – /run/shm/

然後把

innodb_temp_data_file_path=tmp_space2/ibtmp2:200M:autoextend

添加到my.cnf里的[mysqld]下面一行

重啟MySQL服務後,

mysqlselect @@innodb_temp_data_file_path\G

***************************1. row ***************************

@@innodb_temp_data_file_path:tmp_space2/ibtmp2:200M:autoextend

1 rowin set (0.00 sec)

先寫一個批量創建臨時表的存儲過程:

DELIMITER$$

USE`t_girl`$$

DROPPROCEDURE IF EXISTS `sp_create_temporary_table`$$

CREATEDEFINER=`root`@`localhost` PROCEDURE `sp_create_temporary_table`(

IN f_cnt INT UNSIGNED )

BEGIN

DECLARE i INT UNSIGNED DEFAULT 1;

WHILE i = f_cnt

DO

SET @stmt = CONCAT(‘create temporarytable tmp’,i,’ ( id int, tmp_desc varchar(60));’);

PREPARE s1 FROM @stmt;

EXECUTE s1;

SET i = i + 1;

END WHILE;

DROP PREPARE s1;

END$$

DELIMITER;

現在來創建10張臨時表:

mysqlcall sp_create_temporary_table(10);

QueryOK, 0 rows affected (0.07 sec)

如果在以前,我們只知道創建了10張臨時表,但是只能憑記憶或者手工記錄下來臨時表的名字等信息。

現在可以直接從數據字典裡面檢索相關數據。

mysql select * frominformation_schema.innodb_temp_table_info;

+———-+————–+——–+——-+———————-+—————+

|TABLE_ID | NAME | N_COLS | SPACE| PER_TABLE_TABLESPACE | IS_COMPRESSED |

+———-+————–+——–+——-+———————-+—————+

| 56 | #sql1705_2_9 | 5 | 36 | FALSE | FALSE |

| 55 | #sql1705_2_8 | 5 | 36 | FALSE |FALSE |

| 54 | #sql1705_2_7 | 5 | 36 | FALSE | FALSE |

| 53 | #sql1705_2_6 | 5 | 36 | FALSE | FALSE |

| 52 | #sql1705_2_5 | 5 | 36 | FALSE |FALSE |

| 51 | #sql1705_2_4 | 5 | 36 | FALSE | FALSE |

| 50 | #sql1705_2_3 | 5 | 36 | FALSE | FALSE |

| 49 | #sql1705_2_2 | 5 | 36 | FALSE |FALSE |

| 48 | #sql1705_2_1 | 5 | 36 | FALSE | FALSE |

| 47 | #sql1705_2_0 | 5 | 36 | FALSE | FALSE |

+———-+————–+——–+——-+———————-+—————+

10rows in set (0.00 sec)

功能性我就寫到這裡,大家性能方面如果有興趣可以找時間去測試。

原創文章,作者:簡單一點,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/127982.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
簡單一點的頭像簡單一點
上一篇 2024-10-03 23:24
下一篇 2024-10-03 23:24

相關推薦

  • 如何修改mysql的端口號

    本文將介紹如何修改mysql的端口號,方便開發者根據實際需求配置對應端口號。 一、為什麼需要修改mysql端口號 默認情況下,mysql使用的端口號是3306。在某些情況下,我們需…

    編程 2025-04-29
  • Python 常用數據庫有哪些?

    在Python編程中,數據庫是不可或缺的一部分。隨着互聯網應用的不斷擴大,處理海量數據已成為一種趨勢。Python有許多成熟的數據庫管理系統,接下來我們將從多個方面介紹Python…

    編程 2025-04-29
  • openeuler安裝數據庫方案

    本文將介紹在openeuler操作系統中安裝數據庫的方案,並提供代碼示例。 一、安裝MariaDB 下面介紹如何在openeuler中安裝MariaDB。 1、更新軟件源 sudo…

    編程 2025-04-29
  • Python操作MySQL

    本文將從以下幾個方面對Python操作MySQL進行詳細闡述: 一、連接MySQL數據庫 在使用Python操作MySQL之前,我們需要先連接MySQL數據庫。在Python中,我…

    編程 2025-04-29
  • 數據庫第三範式會有刪除插入異常

    如果沒有正確設計數據庫,第三範式可能導致刪除和插入異常。以下是詳細解釋: 一、什麼是第三範式和範式理論? 範式理論是關係數據庫中的一個規範化過程。第三範式是範式理論中的一種常見形式…

    編程 2025-04-29
  • MySQL遞歸函數的用法

    本文將從多個方面對MySQL遞歸函數的用法做詳細的闡述,包括函數的定義、使用方法、示例及注意事項。 一、遞歸函數的定義 遞歸函數是指在函數內部調用自身的函數。MySQL提供了CRE…

    編程 2025-04-29
  • leveldb和unqlite:兩個高性能的數據庫存儲引擎

    本文將介紹兩款高性能的數據庫存儲引擎:leveldb和unqlite,並從多個方面對它們進行詳細的闡述。 一、leveldb:輕量級的鍵值存儲引擎 1、leveldb概述: lev…

    編程 2025-04-28
  • MySQL bigint與long的區別

    本文將從數據類型定義、存儲空間、數據範圍、計算效率、應用場景五個方面詳細闡述MySQL bigint與long的區別。 一、數據類型定義 bigint在MySQL中是一種有符號的整…

    編程 2025-04-28
  • Python怎麼導入數據庫

    Python是一種高級編程語言。它具有簡單、易讀的語法和廣泛的庫,讓它成為一個靈活和強大的工具。Python的數據庫連接類型可以多種多樣,其中包括MySQL、Oracle、Post…

    編程 2025-04-28
  • MySQL左連接索引不生效問題解決

    在MySQL數據庫中,經常會使用左連接查詢操作,但是左連接查詢中索引不生效的情況也比較常見。本文將從多個方面探討MySQL左連接索引不生效問題,並給出相應的解決方法。 一、索引的作…

    編程 2025-04-28

發表回復

登錄後才能評論