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

歡迎訪問 生活随笔!

生活随笔

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

数据库

mysql单表索引个数_MySQL性能:多个表与单个表和分区上的索引

發布時間:2023/12/1 数据库 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql单表索引个数_MySQL性能:多个表与单个表和分区上的索引 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

小編典典

創建20,000個表是一個壞主意。您很快將需要40,000個表,然后更多。

我在《SQL反模式》一書中將此綜合癥稱為

Metadata Tribbles

。您每次計劃創建“每X表格”或“每X列”時都會看到這種情況。

當您有成千上萬個表時,這確實會導致實際的性能問題。每個表都需要MySQL維護內部數據結構,文件描述符,數據字典等。

還有實際的操作后果。您是否真的要創建一個系統,該系統要求您每次注冊新用戶時都創建一個新表?

相反,我建議您使用MySQL分區。

這是對表進行分區的示例:

CREATE TABLE statistics (

id INT AUTO_INCREMENT NOT NULL,

user_id INT NOT NULL,

PRIMARY KEY (id, user_id)

) PARTITION BY HASH(user_id) PARTITIONS 101;

這給您帶來了定義一個邏輯表的好處,同時還可以將該表分為許多物理表,以便在查詢分區鍵的特定值時可以更快地進行訪問。

例如,當您像示例一樣運行查詢時,MySQL僅訪問包含特定user_id的正確分區:

mysql> EXPLAIN PARTITIONS SELECT * FROM statistics WHERE user_id = 1\G

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

id: 1

select_type: SIMPLE

table: statistics

partitions: p1

type: index

possible_keys: NULL

key: PRIMARY

key_len: 8

ref: NULL

rows: 2

Extra: Using where; Using index

分區的HASH方法意味著通過整數分區鍵的模數將行放置在分區中。這確實意味著許多user_id都映射到同一分區,但是每個分區平均只有平均行數的1 /

N(其中N是分區數)。而且您用固定數量的分區來定義表,因此不必在每次獲得新用戶時都對其進行擴展。

您可以選擇多達1024個分區(在MySQL 5.6中為8192)的任意數量的分區,但是有些人報告說,當分區過高時會出現性能問題。

建議使用素數分區。如果您的user_id值遵循某種模式(例如僅使用偶數),則使用質數分區可以幫助更均勻地分配數據。

在評論中回答您的問題:

如何確定合理的分區數量?

對于HASH分區,如果您使用101個分區(如上例所示),則任何給定分區平均約占行的1%。您說統計信息表有3000萬行,因此,如果使用此分區,則每個分區只有30萬行。對于MySQL而言,這更容易閱讀。您也可以(也應該)使用索引-

每個分區都有其自己的索引,并且其大小僅為整個未分區表的索引的1%。

因此,如何確定合理數量的分區的答案是:整個表有多大,并且您希望分區平均有多大?

分區數量不應該隨著時間增長嗎?如果是這樣:我該如何自動化?

如果您使用HASH分區,則分區的數量并不一定需要增加。最終,您可能總共有300億行,但是我發現,當您的數據量增長幾個數量級時,無論如何都需要一種新的體系結構。如果您的數據變得如此之大,則可能需要在多個服務器上進行

分片 以及將其分區到多個表中。

也就是說,您可以使用ALTER TABLE重新分區表:

ALTER TABLE statistics PARTITION BY HASH(user_id) PARTITIONS 401;

這必須重新組織表(就像大多數ALTER TABLE更改一樣),因此希望它花一些時間。

您可能要監視分區中數據和索引的大小:

SELECT table_schema, table_name, table_rows, data_length, index_length

FROM INFORMATION_SCHEMA.PARTITIONS

WHERE partition_method IS NOT NULL;

與任何表一樣,您希望活動索引的總大小適合您的緩沖池,因為如果在SELECT查詢期間MySQL必須在緩沖池中交換部分索引進出索引,則性能會受到影響。

如果使用RANGE或LIST分區,則添加,刪除,合并和拆分分區更為常見。見http://dev.mysql.com/doc/refman/5.6/en/partitioning-

management-range-

list.html

2020-05-17

總結

以上是生活随笔為你收集整理的mysql单表索引个数_MySQL性能:多个表与单个表和分区上的索引的全部內容,希望文章能夠幫你解決所遇到的問題。

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