2011-05-04 157 views
1

說我有一個名爲materials是否可以索引表的evey列?

materials表表包含列

item name | item description | stock date | sale date| price | 

我所尋找到一些時候,我可能希望通過item name排序結果,並且可以通過item description,並且可以通過stock date和可能是sale dateprice

因此,如何我按照上述標準設計的表?如何將索引添加到所有列?是否有必要向所有人添加索引?

任何幫助?

以及我的表將有超過一百萬行

我使用PHP和MySQL

回答

0

ORDER BY

看看列上添加索引加快了搜索查詢,但會減慢插入/刪除。但是,首先讓你的應用程序工作,然後進行優化。

2

這是值得一讀http://use-the-index-luke.com/ - 是的,你可以索引每列;它很少會做任何好事,因爲你必須調整你實際運行的查詢的索引。

+0

有用的網站!它也會派上用場! – James 2011-05-04 11:33:11

+0

我的表格將有超過百萬行 – alwyn 2011-05-04 11:36:37

+0

所有理由有創建索引的結構化方法。從其他答案中可以得到很好的建議 - 但通常情況下,應用程序的性能取決於SQL能夠以多快的速度找到記錄,而不是它能夠對結果集進行排序的速度。 – 2011-05-04 13:36:01

0

如果你想索引協助各列進行排序,你應該建立在每列的索引。

請注意,索引掃描不一定更快:如果您希望返回記錄的全部(或甚至是重要部分),那麼filesort最有可能效率更高(除非您的表格真的很大,無論如何都不想要所有記錄)。如果您正在使用LIMIT一起使用ORDER BY

指標只會幫助。應根據標準創建

+0

我的表格將有超過百萬行 – alwyn 2011-05-04 11:37:08

+0

@alwyn:你會在屏幕上顯示它們嗎? – Quassnoi 2011-05-04 11:42:44

+0

是啊使用分頁 – alwyn 2011-05-04 11:58:42

0

指標,你的情況簡單的例子是,你可能希望搜索您的表是一個特定的價格項目。該指數應該是項目名稱,項目描述和價格。

我傾向於計劃表,讓我知道我可能做的,然後相應地創建索引。所以你可能有一個函數,getsItemsBySaleDate()getItemsCheaperThan()等...這些都會有不同的索引,因爲它們都會搜索表內的不同列。我現在建議只爲表格上的每一列創建一個索引。

我也想補充一個:

item_search => itemname, itemdescription, price 
+0

我的表格將有超過百萬行 – alwyn 2011-05-04 11:36:46

0

當然,你應該爲每個排序標準的一個索引。不要忘記爲索引定義額外的鍵。例如對於價格鍵,您應該添加商品名稱,因此商品不僅按價格排序,而且還按名稱排序(在同一定價組中)。

正如其他人所說的,要小心索引的數量:每次插入或更新時都必須更新所有索引。你真的想分類描述

0

爲什麼要使用一個索引

索引用於兩件事情。項目

  1. 選擇
  2. 排序列表

的有關項目,你需要指數的選擇,因爲通過所有記錄搜索是不是一種選擇。

但是,如果您只有一次select 100個項目,MySQL可以輕鬆地對這些項目進行排序而無需使用索引。

因此,首先將索引放在wherejoin子句中的項目上。
然後查看每個查詢選擇了多少個項目。如果它少於200,我就不會爲索引進行排序。

添加索引

CREATE INDEX ON index_name tbl_name(價格)

參見:http://dev.mysql.com/doc/refman/5.1/en/create-index.html

因爲你可以給一個索引的所有選項。

創建表

我的建議:

CREATE TABLE materials (
    id integer not null autoincrement primary key, 
    name varchar not null, 
    description varchar not null, 
    stockdate date not null, 
    saledate date not null, 
    price decimal(10,2) not null, 
    /*my suggestion, put an index on all, but not on description*/ 
    INDEX `i_name` (name), 
    INDEX `i_stockdate` (stockdate), 
    INDEX `i_saledate` (saledate), 
    INDEX `i_price` (price)) ENGINE = MyISAM; 

如果選擇在where子句中的描述,然後再加上一個說明全文索引。

CREATE FULLTEXT INDEX i_description ON materials (description); 

如果你只對排序描述添加索引,這是不值得的海事組織。

相關問題