Mysql

MySQL 列類型以提高性能

  • August 10, 2017

我將有一張桌子,其中:

  • userid(連結到使用者表中的使用者 ID)
  • 文件夾名稱(一個 varchar,最多 260 個字元)
  • 條目(varchar,最大1024
  • 數據(varchar,最大20kb

單個使用者將有多個文件夾名稱和條目。

關鍵是,查詢永遠不會搜尋條目或數據中的任何內容。查詢只會像

select * from data where userid  = 1 and foldername = 'first';

而已。

所以我想到了兩個選擇:

  • 一種。而不是條目和數據列,將它們儲存在 HDD 中,僅將文件名儲存在 DB 中,因此當查詢返回時,PHP app. 將讀取文件名,然後讀取文件並在 HTTP 響應中將其發送給使用者。
  • 灣。如上所述將它們儲存在數據庫中

但我永遠不會對它們執行查詢,因此不需要排序/索引,也不會執行全文搜尋。

問題

  • 這裡最好的優化是什麼?
  • 如何在 MySQL 中將列定義為“不是真正的數據庫條目”類型,或者文件更好?

將 VARCHAR 作為索引的一部分雖然可行,但管理起來會很麻煩。

我會按如下方式設計表格

CREATE TABLE folderkeys
(
   id INT NOT NULL AUTO_INCREMENT,
   userid INT NOT NULL,
   foldername VARCHAR(260),
   PRIMARY KEY (id),
   UNIQUE KEY (userid,foldername)
) ENGINE=MyISAM;
CREATE TABLE datatable
(
   id INT NOT NULL AUTO_INCREMENT,
   folderkey_id INT NOT NULL,
   filename VARCHAR(1024),
   PRIMARY KEY (id),
   KEY (folderkey_id)
) ENGINE=MyISAM;

這將使數據表索引盡可能字元壓縮

這將使執行以下查詢變得容易

INSERT IGNORE INTO folderkeys (userid,foldername) VALUES (1,'first');
SELECT id INTO @fldrkey FROM folderkeys WHERE userid=1 AND foldername='first';
INSERT INTO datatable (folderkey_id,filename) VALUES (@fldrkey,'...');

如果您想要來自使用者 ID 1 文件夾名“first”的文件名,您將執行這樣的查詢

SET @GivenUserID = 1;
SET @GivenFolder = 'first';
SELECT A.userid,A.foldername,B.filename FROM
(SELECT id FROM folderkeys WHERE userid = @GivenUserID AND foldername=@GivenFolder) A
INNER JOIN datatable B ON A.id = B.folderkey_id;

如果您想要使用者 ID 27 的所有文件夾中的文件名,您將執行這樣的查詢

SET @GivenUserID = 27;
SELECT A.userid,A.foldername,B.filename FROM
(SELECT id FROM folderkeys WHERE userid = @GivenUserID) A
INNER JOIN datatable B ON A.id = B.folderkey_id;

試一試 !!!

我通常會推薦使用 InnoDB。由於您有大量 BLOB 數據,我寧願不花時間嘗試調整您的日誌緩衝區和日誌文件大小。我現在會選擇 MyISAM。

順便說一句,我給了你帶有選項 A 的表格

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