假设我有一个名为materials
materials
表包含列
item name | item description | stock date | sale date| price |
我正在研究的是有时我可能需要item name
排序结果,可能是item description
,可能是stock date
,可能是sale date
和按price
。
那么我如何根据上述标准设计表格呢?如何为所有列添加索引?是否有必要为所有人添加索引?
任何帮助?
我的桌子将有超过一百万行
我正在使用PHP和MySQL
答案 0 :(得分:2)
没有理由为什么你不能在每一列上都有索引,如果它有帮助的话。您必须牢记索引的后果,如减慢插入/删除。你需要权衡专业人士和骗子。
创建索引......
答案 1 :(得分:2)
值得一读http://use-the-index-luke.com/ - 是的,你可以索引每一列;它很少会有任何好处,因为你必须调整你实际运行的查询的索引。
答案 2 :(得分:0)
查看ORDER BY
在列上添加索引会加快搜索查询速度,但会降低插入/删除速度。但是,首先让您的应用程序工作,然后进行优化。
答案 3 :(得分:0)
如果要对每列进行索引辅助排序,则应在每列上创建索引。
请注意,索引扫描不一定更快:如果您想要返回所有(甚至是重要部分)记录,那么filesort
很可能会更有效率(除非您的表格非常大,其中无论如何你不想要所有记录。
索引仅在ORDER BY
与LIMIT
一起使用时才有用。
答案 4 :(得分:0)
索引,在您的情况下,您可能希望在表格中搜索特定价格的项目。该索引应该是项目名称,项目描述和价格。
我倾向于计划表格,以便我知道我可能会做什么,然后相应地创建索引。所以你可能有getsItemsBySaleDate()
或getItemsCheaperThan()
等函数......这两个函数都有不同的索引,因为它们都会搜索表中的不同列。我建议现在只需为表中的每一列创建一个索引。
我还要添加一个:
item_search => itemname, itemdescription, price
答案 5 :(得分:0)
当然,您应该为每个排序条件创建一个索引。不要忘记为索引定义其他键。例如对于价格键,您应该添加商品名称,因此商品不仅会按价格排序,还会按名称排序(在同一个价格组中)。
正如其他人所说,请注意索引的数量:每次插入或更新时都必须更新所有索引。您真的想要对 description 上的项目进行排序吗?
答案 6 :(得分:0)
为何使用索引
索引用于两件事。
选择需要索引的项目,因为搜索所有记录不是一种选择。
但是,如果您一次只有select
100个项目,MySQL可以轻松地对这些项目进行排序,而无需使用索引。
首先将索引放在where
和join
子句中的项目上
然后查看每个查询选择的项目数。如果它少于200,我就不会打扰索引进行排序。
添加索引
CREATE INDEX index_name
ON tbl_name(price)
请参阅: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);
如果您只对描述不添加索引进行排序,则不值得IMO。