所有數據的一個 MySQL 表與幾個不同的引擎 MySQL 表
我做了很好的研究,並瀏覽了這方面的一些資訊。但我還不滿意,所以寧願直接問。
我正在設計一個應用程序數據庫的架構,假設它有數百萬條記錄。
其中一些經常更新,而另一些則很少更新。因此,我決定根據性質將數據分佈在不同的表上,並將
JOIN
它們放在查詢中。那麼,這是更好還是.. 一張桌子(沒有
JOIN
)?假設它是一個租車管理系統。
以下是表格:
DESC cars +-----------------+---------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------------+---------------------+------+-----+---------+-------+ | id | bigint(20) unsigned | NO | PRI | NULL | ai | | brand | varchar(40) | NO | | NULL | | | engine_capacity | tinyint(4) | NO | | NULL | | | model | tinyint(4) | NO | | NULL | | | serialnumber | bigint(20) | NO | UNI | NULL | | +-----------------+---------------------+------+-----+---------+-------+
和
DESC cars_data; +---------------+----------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------------+----------------------+------+-----+---------+-------+ | carid | bigint(20) unsigned | NO | PRI | NULL | ai | | car_status | enum('1','2','3') | NO | MUL | 1 | | | base_location | point | NO | MUL | NULL | | | driver_id | bigint(20) unsigned | NO | MUL | NULL | | +---------------+----------------------+------+-----+---------+-------+
假設這兩個表都很少更新,因此我為它們使用了MyISAM,原因如下:
- 需要儲存點數據並在其上使用空間索引。
- 節省磁碟空間(因為MyISAM表的大小更小)。
- 更容易維護(根據我的經驗,對嗎?)。
這是經常更新的表格:
DESC cars_extra; +---------------+---------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------------+---------------------+------+-----+---------+-------+ | carid | bigint(20) unsigned | NO | PRI | NULL | ai | | odometer_km | tinyint(6) unsigned | NO | | NULL | | | last_maint | bigint(20) unsigned | NO | | NULL | | | last_update | bigint(20) unsigned | NO | | NULL | | +---------------+---------------------+------+-----+---------+-------+
我用於最後一個表InnoDB的一個主要原因是:
- 在更新期間避免表級鎖。
建議和一般說明將不勝感激:-)
此外,連接通常是利弊還是利弊(使用適當的索引鍵)。
簡單地說,一切都使用 InnoDB。MyISAM 將在下一個版本中消失。在幾乎所有情況下,InnoDB 都優於 MyISAM。MyISAM 的唯一優勢是磁碟空間。
擁有數百萬行,您將欣賞 InnoDB 在任何崩潰後的自動恢復。
將兩張桌子以 1:1 的比例設置很少是明智的。您對此的建議是基於一張表是不變的;另一個經常被修改。但我建議“頻繁”是“一秒鐘多次”,而不是“一天幾次”。
不要在沒有勾畫出
SELECTs
. 你有POINT
和SPATIAL
,但你會用它做什麼?掃了一眼桌子……
使用
SHOW CREATE TABLE
;它比 更具描述性DESCRIBE
。不要使用
BIGINT
(8 字節),除非INT
(4 字節)不夠用。你需要雇傭世界上幾乎所有的成年人才能超出你的能力範圍INT UNSIGNED
。
JOIN
可以是讚成或反對。但這很少是決定性因素。從一開始就使用 utf8mb4。(
DESCRIBE
如果資訊省略了那一點。)
AUTO_INCREMENT
僅在沒有構成 ’natural’ 的 ‘reasonable’ 列(或列組合)時使用PRIMARY KEY
。
TINYINT UNSIGNED
僅限於 255,不足以用於里程表。MEDIUMINT UNSIGNED
高達16M。不要沒有
PARTITION
充分的理由。