通过排序行进行MySQL优化

时间:2009-11-23 06:57:58

标签: sql mysql optimization indexing

我不是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(INSERT和UPDATE在我的程序中很少见),我想我应该在列'文件'中添加一个INDEX(几乎所有SELECT都只使用这一列)。

然而,我的问题是“总是按'''的字母顺序存储行不是更有效率,而不是创建索引?”所以,“是否有可能通知MySQL数据按此顺序排序并强制它在表格中插入元素时保持该顺序?”。

我不确定我的问题是否真的有意义,因为也许这只是一个特殊情况,其中表中已有一种索引...但我真的想得到一个答案...... < / p>

提前致谢!

3 个答案:

答案 0 :(得分:3)

如果file是您的主键,它几乎肯定已经有了它的索引。这就是主键的工作原理。您不必为该特定列指定另一个索引。

并且,为了回答您是否可以存储在DBMS中排序的行的问题,您不能。 SQL是一种关系代数,它将以任何顺序提取行,除非您专门使用order by子句。

执行查询时:

select * from photos;

无法保证行将以何种顺序发送给您。另一方面:

select * from photos order by file;

确保订单,file主键索引将用于按顺序提取记录。应该没有排序或其他性能损失,因为主键索引是为有序访问行而构建的。

您最好将主键视为一种特殊类型的索引。如果您认为有必要,您当然可以索引其他列(尽管听起来并非如此)。

答案 1 :(得分:1)

  

然而,我的问题是“不会   总是存储更有效率   按字母顺序排列的'文件',   而不是创建索引?“等等,   “是否有可能通知MySQL   数据按该顺序排序   迫使它在什么时候保持秩序   在表格中插入元素?“。

在MSSQL用语中称为聚集索引。虽然在文件字段上执行ORDER BY(具有聚簇索引)会加快查询速度,但由于记录的物理重新排序(请参阅 page-splitting ),插入记录可能会变慢;因为传入的文件值本质上不是顺序的。聚簇索引非常适用于自动递增的主键或在数据库中按顺序输入的任何ID。或者,您可能会在文件字段上增加聚簇索引的页面大小,因此页面拆分不会发生太多。每个表只能有一个聚簇索引,原因很明显。

[编辑:2009年11月23日下午5:55 CN]

嗨彼得,Mysql有clustered index。 Mysql虽然支持聚簇索引,但它只能在主键上执行。如果您的文件名字段确实是主键,那么您可以在其上标记聚簇索引。 MySQL上的聚簇索引仅用于主键,而MSSQL允许您在任何字段上使用。除主键之外的聚簇索引是有用的,例如联系人数据库;虽然帐户ID(某种非面向用户的内部号码)是主键,但在联系人姓名上分配聚集索引更为谨慎,因为这是您经常向用户提供联系人列表的方式,想想iPhone或任何智能手机联系人数据库或CRM等,他们经常使用姓名列出联系人,而不是他们的电话号码和内部ID(主键(想想guid或某种整数身份))

答案 2 :(得分:0)

简短回答:你不应该在乎。

在纯SQL中,正如pax所指出的,有 没有关于如何存储数据的概念。 如果您想使用列进行访问,那么 指定一个索引 - 几乎总是如此 如果指定a,则自动完成 主键。

有优化,但是这个 将受限于特殊情况 你不应该关心,除非 你是DBA。