【问题标题】:Is it possible to index evey columns of a table?是否可以索引表的每一列?
【发布时间】:2011-08-18 11:09:04
【问题描述】:

假设我有一张名为materials的表

materials 表包含列

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

我正在调查的是,有时我可能希望按 item name 排序结果,可能是 item description,可能是 stock date,可能是 sale dateprice

那么我如何根据上述标准设计表格?以及如何为所有列添加索引?是否需要全部添加索引?

有什么帮助吗?

我的表将有超过一百万行

我正在使用 PHP 和 MySQL

【问题讨论】:

    标签: php mysql datatable


    【解决方案1】:

    为什么要使用索引

    索引用于两件事。

    1. 项目选择
    2. 列表排序

    为了选择您需要索引的项目,因为搜索所有记录不是一种选择。

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

    所以首先将索引放在 wherejoin 子句中的项目上。
    然后查看每个查询选择了多少项目。如果它少于 200,我不会为排序而烦恼。

    添加索引

    在 tbl_name(价格)上创建索引 index_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);
    

    如果你只按描述排序添加索引,IMO 不值得。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        应根据条件创建索引,在您的情况下的一个简单示例是您可能希望在表中搜索具有特定价格的项目。该索引应该是项目名称、项目描述和价格。

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

        我还要添加一个:

        item_search => itemname, itemdescription, price
        

        【讨论】:

        • 我的表将有超过百万行
        【解决方案4】:

        如果你想对每一列进行索引辅助排序,你应该在每一列上创建一个索引。

        请注意,索引扫描不一定更快:如果您希望返回所有(甚至大部分)记录,那么filesort 很可能会更有效(除非您的表非常大,在这种情况下您无论如何都不想要所有记录)。

        仅当您同时使用 ORDER BYLIMIT 时,索引才会有所帮助。

        【讨论】:

        • 我的表将有超过百万行
        • @alwyn:你一直在说:“我的表将有超过一百万行”,请告诉我说“我的表将有超过一百万行”是什么感觉?
        • @Johan:我叔叔的桌子上曾经有 1000 万条记录,但现在他破产了,他在我家附近闲逛,要一两条记录。
        【解决方案5】:

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

        【讨论】:

        • 有用的网站!它也会对我派上用场!
        • 我的表将有超过百万行
        • 更有理由采用结构化的方法来创建索引。其他答案提供了很好的建议 - 但通常,您的应用程序的性能将更多地取决于 SQL 找到记录的速度,而不是它对结果集进行排序的速度。
        【解决方案6】:

        看看ORDER BY

        在列上添加索引可加快搜索查询,但会减慢插入/删除速度。但是,请先让您的应用程序正常运行,然后再进行优化。

        【讨论】:

          【解决方案7】:

          如果有帮助的话,你没有理由不能在每一列上都有一个索引。您必须牢记索引的后果,例如减慢插入/删除速度。你需要权衡利弊。

          创建索引...

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

          【讨论】:

          • 我的表将有超过百万行
          猜你喜欢
          • 1970-01-01
          • 2019-10-20
          • 1970-01-01
          • 1970-01-01
          • 2020-04-04
          • 1970-01-01
          • 2016-11-14
          • 2011-03-13
          • 2019-05-18
          相关资源
          最近更新 更多