Mysql
MySQL 列類型以提高性能
我將有一張桌子,其中:
- 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 的表格