是否可以索引表的每一列?

时间:2011-05-04 11:26:46

标签: php mysql datatable

假设我有一个名为materials

的表格

materials表包含列

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

我正在研究的是有时我可能需要item name排序结果,可能是item description,可能是stock date,可能是sale date和按price

那么我如何根据上述标准设计表格呢?如何为所有列添加索引?是否有必要为所有人添加索引?

任何帮助?

我的桌子将有超过一百万行

我正在使用PHP和MySQL

7 个答案:

答案 0 :(得分:2)

没有理由为什么你不能在每一列上都有索引,如果它有帮助的话。您必须牢记索引的后果,如减慢插入/删除。你需要权衡专业人士和骗子。

创建索引......

http://dev.mysql.com/doc/refman/5.0/en/create-index.html

答案 1 :(得分:2)

值得一读http://use-the-index-luke.com/ - 是的,你可以索引每一列;它很少会有任何好处,因为你必须调整你实际运行的查询的索引。

答案 2 :(得分:0)

查看ORDER BY

在列上添加索引会加快搜索查询速度,但会降低插入/删除速度。但是,首先让您的应用程序工作,然后进行优化。

答案 3 :(得分:0)

如果要对每列进行索引辅助排序,则应在每列上创建索引。

请注意,索引扫描不一定更快:如果您想要返回所有(甚至是重要部分)记录,那么filesort很可能会更有效率(除非您的表格非常大,其中无论如何你不想要所有记录。

索引仅在ORDER BYLIMIT一起使用时才有用。

答案 4 :(得分:0)

应该根据标准创建

索引,在您的情况下,您可能希望在表格中搜索特定价格的项目。该索引应该是项目名称,项目描述和价格。

我倾向于计划表格,以便我知道我可能会做什么,然后相应地创建索引。所以你可能有getsItemsBySaleDate()getItemsCheaperThan()等函数......这两个函数都有不同的索引,因为它们都会搜索表中的不同列。我建议现在只需为表中的每一列创建一个索引。

我还要添加一个:

item_search => itemname, itemdescription, price

答案 5 :(得分:0)

当然,您应该为每个排序条件创建一个索引。不要忘记为索引定义其他键。例如对于价格键,您应该添加商品名称,因此商品不仅会按价格排序,还会按名称排序(在同一个价格组中)。

正如其他人所说,请注意索引的数量:每次插入或更新时都必须更新所有索引。您真的想要对 description 上的项目进行排序吗?

答案 6 :(得分:0)

为何使用索引

索引用于两件事。

  1. 选择项目
  2. 对列表进行排序
  3. 选择需要索引的项目,因为搜索所有记录不是一种选择。

    但是,如果您一次只有select 100个项目,MySQL可以轻松地对这些项目进行排序,而无需使用索引。

    首先将索引放在wherejoin子句中的项目上 然后查看每个查询选择的项目数。如果它少于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。

相关问题