Mysql

所有數據的一個 MySQL 表與幾個不同的引擎 MySQL 表

  • November 23, 2016

我做了很好的研究,並瀏覽了這方面的一些資訊。但我還不滿意,所以寧願直接問。

我正在設計一個應用程序數據庫的架構,假設它有數百萬條記錄。

其中一些經常更新,而另一些則很少更新。因此,我決定根據性質將數據分佈在不同的表上,並將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. 你有POINTSPATIAL,但你會用它做什麼?

掃了一眼桌子……

使用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充分的理由。

引用自:https://dba.stackexchange.com/questions/156086