mysql数据库中到底能建多少张表?(单实例下单个库)
單實例mysql數據庫中到底能建多少張表?
業務兩個同學今天就這個問題過來探討,他們的訴求是:
? 1. 一個用戶的表要全部放到一個數據庫中。
? 2. 預計1000個用戶每個用戶初步規劃1000張表。 這100W張表如何規劃如何放的問題。
? 3. 后期擴容也要考慮。后期擴容要可擴、方便、且用再修改應用程序代碼?
?
?面對這樣一個場景,技術層面的很好解決,例如數據庫到底能存多少張表?查官網資料即可確定。最重要的是要深入了解這么多表如何來的?來源是不是就有問題?有其他解決方案?這個需要深入的了解業務設計。這里不說業務,單說技術層面的。
mysql的配置項里是否有對一個數據庫中,是否有最大數據表的限制,后面查詢了相關資料發現,mysql數據庫中,對單個數據庫中的最大允許建立的數據表是沒有配置項,也就是說沒有限制的。
但是如果你執意要知道MYSQL能夠建立多少個表的話,可以參考以下理論值的資料吧:
在mysql中,每個數據庫最多可創建20億個表,一個表允許定義1024列,每行的最大長度為8092字節(不包括文本和圖像類型的長度)。
當表中定義有varchar、nvarchar或varbinary類型列時,如果向表中插入的數據行超過8092字節時將導致Transact-SQL語句失敗,并產生錯誤信息。
? ? ? ?---- 這個可以用腳本模擬創建表進行測試。創建到20億之后基本上就創建失敗。腳本退出執行。原因待確定中。。。。。。
mysql單數據庫對數據表限制數量的問題:
? ? ?1.一個數據庫是沒有表現值的,或者說這個被限制的值很大
? ? ?2.一個mysqld服務可以支持的表對象數量是,單一存儲引擎InnoDB限制為40億多點,所以這個限制基本上不需要考慮
從性能考慮的話,一個數據庫建立多少張表適合的問題:
? ? ? 1.當一個數據庫或實例中,表太多,意味著可能同時需要打開的表,從操作系統角度說就是:文件描述符很多,這個操作系統有限制的,
? ? ? ? ?但是可以修改操作系統的內核參數達到。Linux最大打開文件數為65535個。
? ? ? 2.多少表性能就會下降,分2點闡述
? ? ? ? 2.1.分表多,意味著需要維護的表結構和統計信息多,一般情況下此不會成為任何瓶頸,但是太不合理,比如幾萬甚至更大,可能就有問題了
? ? ? ? 2.2.性能是否下降明顯,最直接的就是:跟服務器的承載能力和數據量有關系,這個是最直接的
?
? ? ?3.反問“為何要分很多表”呢?
? ? ? ? ? ?3.1.分表太多,容易造成程序邏輯復雜,降低性能,以及增加出錯的風險點
? ? ? ? ?3.2.若是表中的數據量(指容量,多少GB)很大,只是分表解決不了問題,因為在同一個服務器上,其物理IO能力最優先達到瓶頸
所以,一個數據庫建立多少表,這個MYSQL是沒有限制的。但是從性能考慮,肯定是有一定影響的,但是從IO和其他服務器性能考慮,這塊的性能基本上還不足影響到很大成份。
? ? ? ? ?所以建議大家一個數據庫建立在二百個表以下(保守值,最多不要超過500個),這樣也是比較合理的了。影響性能也不大。
? ? ?
?第二個問題:
? ? ? ? ? ?如果必須真有那么多表需要創建,需要做好多庫,多數據盤規劃:
? ? ? ? ? 例如表指定具體的其他盤的存儲路徑:
? ? ? ? mysql> SHOW VARIABLES LIKE 'innodb_file_per_table'; ? ?#先檢查一下配置變量 +-----------------------+-------+ | Variable_name ? ? ? ? | Value | +-----------------------+-------+ | innodb_file_per_table |?ON?? ?| +-----------------------+-------+ 1 row in set (0.00 sec)如果innodb_file_per_table值為OFF,可以動態修改:set global innodb_file_per_table=1;CREATE TABLE temp3 (empno smallint(4) not null,ename varchar(10),job varchar(9),mgr smallint(4),hiredate date,sal float(7, 2),comm float(7, 2),deptno tinyint(2) ) engine=innodb charset=utf8 data directory='/u01/mysql/temp/';[root@test1 temp]# pwd /u01/mysql/temp [root@test1 temp]# ls temp2.MYD ?temp2.MYI ?temp.MYD ?temp.MYI ?test ? ? #由于表在test庫下,所以在指定的目錄里產生了個test目錄分區表:
CREATE TABLE orders_list2 (id INT AUTO_INCREMENT,customer_surname VARCHAR(30),store_id INT,salesperson_id INT,order_date DATE,note VARCHAR(500),INDEX idx (id) ) ENGINE = INNODBPARTITION BY LIST(store_id) (PARTITION p1VALUES IN (1, 3, 4, 17)INDEX DIRECTORY = '/var/orders/district1'DATA DIRECTORY = '/var/orders/district1',PARTITION p2VALUES IN (2, 12, 14)INDEX DIRECTORY = '/var/orders/district2'DATA DIRECTORY = '/var/orders/district2',PARTITION p3VALUES IN (6, 8, 20)INDEX DIRECTORY = '/var/orders/district3'DATA DIRECTORY = '/var/orders/district3',PARTITION p4VALUES IN (5, 7, 9, 11, 16)INDEX DIRECTORY = '/var/orders/district4'DATA DIRECTORY = '/var/orders/district4',PARTITION p5VALUES IN (10, 13, 15, 18)INDEX DIRECTORY = '/var/orders/district5'DATA DIRECTORY = '/var/orders/district5' );? ? ??
? ? ? ? ?2.? table_open_cache, innodb_open_files和open_files_limit 這3個mysql參數配置的盡可能大
? ? ? ? ? ??不過mysqld啟動之后,你看一下這3個變量,它們最終實際值是操作系統分配給mysqld進程的,并不一定能達到你配置的值。
? ? ? ? ?因為 如果表文件(.frm, .ibd等)放到同一個目錄,那么打開表都會很慢,因為每次打開一個表都要打開對應的2個表文件,文件系統效率會降低。?(如果這些表不是都用到,建議把不用的表歸檔然后從實例中刪除。)如果這幾十萬張表都是有用的,那么你要考慮分庫分表,以及考慮數據庫設計是否合理,每個表是不是只有很少的數據,這些表能否合并,等等。否則,系統查詢這三四十萬張表的需要反復在table cache中淘汰打開的表才能打開更多的表,性能會降低很多。打開每個表需要打開2個文件,通常linux操作系統不允許一個進程打開的文件達到六十萬到八十萬個的,在這樣的極限狀態下操作系統的文件系統的運行效率也會大大降低。所以你需要把table_open_cache, innodb_open_files和open_files_limit 這3個mysql參數配置的盡可能大。
? ? 3.? 規劃Innodb表空間
? ??從Innodb的官方文檔中可以看到,其表空間的最大限制為64TB,也就是說,Innodb的單表限制基本上也在64TB左右了,當然這個大小是包括這個表的所有索引等其他相關數據。
? ? ? ? ?原理性的東西;
? ? ? ? ?http://www.linuxidc.com/Linux/2015-01/111241.htm
? ? ? ?操作步驟:
? ? ? ?http://blog.csdn.net/zm2714/article/details/8479974/
?
?
?
總結
以上是生活随笔為你收集整理的mysql数据库中到底能建多少张表?(单实例下单个库)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 把一个合数分成质数的乘积
- 下一篇: mysql 三个表级联查询,以主表为主数