2009-11-23 72 views
0

我不是MySQL的專家,並且我沒有找到解決方案就搜索了很多關於以下問題的內容。通過對行進行排序來優化MySQL

所以,我使用的是MySQL表採用這種結構:

CREATE TABLE photos (
    file varchar(30) NOT NULL default "", 
    place tinytext NOT NULL default "", 
    description tinytext NOT NULL default "", 
    type char(1) NOT NULL default "", 
    taken year NOT NULL default "0000", 
    modified tinyint NOT NULL default 0, 
    PRIMARY KEY (file) 
); 

第一個參數是到一個文件中的相對路徑。它被用作主鍵。

目前,行是而不是排序(這意味着我在phpMyAdmin中觀察到的順序,默認情況下是項目插入表中的順序)。由於99%的訪問表是SELECT(插入和更新在我的程序中很少見),我想我應該在列'文件'中添加一個INDEX(幾乎所有的SELECT都只使用這一列) 。

但是,我的問題是「總是按照'文件'的字母順序存儲行,而不是創建索引會更有效嗎?」所以,「是否可以通知MySQL數據按照該順序排序,並強制它在表中插入元素時保持該順序?」。

我不確定我的問題是否真的有意義,因爲也許這只是一個特定的情況,表中已經有一種索引......但我真的很想有一個答案......

在此先感謝!

回答

1

不過,我的問題是:「不會是 是 而不是創建一個索引更高效總是通過‘文件’的字母順序顯示 行存放,?」那麼, 「是否可以通知MySQL, 數據按該順序排序, 強制它在保留該順序時將 插入表中?」。

在MSSQL的說法中稱爲聚簇索引。雖然文件上做現場ORDER BY(已聚集索引)應加快您的查詢,插入記錄可以減緩因身體重新排序(見page-splitting)的記錄;因爲傳入的文件值本質上不是連續的。聚簇索引是自動遞增的主鍵或在數據庫中順序輸入的任何ID的理想選擇。或者,也許你可以在文件字段中增加聚簇索引的頁面大小,這樣分頁就不會發生太多。每張表可能只有一個聚集索引,原因很明顯。

[編輯:2009年11月23日5:55 PM CN]

喜彼得,Mysql已經clustered index。 Mysql雖然支持聚簇索引,但它只能在主鍵上這樣做。如果你的文件名字段實際上是一個主鍵,那麼你可以在其上標記聚簇索引。 MySQL上的聚簇索引僅用於主鍵,而MSSQL則允許您在任何字段上使用。主鍵以外的聚集索引很有用,例如聯繫人數據庫;雖然帳戶ID(某些內部號碼不是面向用戶的)是主鍵,但在聯繫人姓名上分配聚集索引更爲謹慎,因爲這就是您經常向用戶展示聯繫人列表的方式,想想iPhone或任何智能手機聯繫人數據庫或CRM等,他們經常使用的名稱,而不是他們的電話號碼,也沒有他們的內部ID(主鍵(GUID覺得還是有些整數身份))

+0

這是偉大的,如果OP是使用SQL Server ... – 2009-11-23 07:27:08

+0

@OMG小馬:第一:在明知有關聚簇索引,即使你使用RDBMS什麼是錯,不支持他們呢? OP顯然需要一些關於關係數據庫基礎知識的幫助。第二:雖然MyISAM引擎完全不支持聚簇索引,但InnoDB將* all *表組織爲基於B樹的聚簇索引。 – 2009-11-23 09:32:20

+0

謝謝Michael!我會嘗試聚簇索引。我確實需要在我的主鍵上! – 2009-11-23 12:20:42

3

如果file是你的主鍵,它幾乎肯定已經有了它的索引。這就是主鍵的工作原理。您不必爲該特定列指定另一個索引。

而且,作爲對您是否可以存儲排序在DBMS中的行的問題的迴應,您不能。 SQL是一個關係代數,它將提取任意的行,除非您特別使用order by子句。

當您執行查詢:

select * from photos; 

有以什麼順序排將交付給你難保。在另一方面:

select * from photos order by file; 

不保證順序,以及file主鍵索引將被用於在爲了提取記錄。由於主鍵索引是爲有序訪問行而構建的,因此不應該有排序或其他性能損失。

您最好將主鍵看作只是一種特殊類型的索引。如果您認爲有必要,您肯定可以對其他列進行索引(儘管在這裏聽起來並非如此)。

0

簡短的回答列表中的聯繫人:你不應該在乎。

在純SQL,如PAX指出,有 沒有的數據是如何存儲的概念。 如果你要使用訪問一列,然後 指定索引 - 這將是,如果你指定一個 主鍵幾乎總是 自動完成。

有優化,但是這 將被限制在特殊情況下 與除非 你是一名DBA,你不應該擔心。

相關問題