sql - 通过对行进行排序来优化 MySQL

标签 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 在我的程序中很少见),我想我应该向"file"列添加一个 INDEX(几乎所有的 SELECT 都只使用该列)。

但是,我的问题是“始终按‘文件’的字母顺序存储行而不是创建索引会不会更有效?”因此,“是否可以通知 MySQL 数据已按该顺序排序,并在向表中插入元素时强制它保持该顺序?”。

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

提前致谢!

最佳答案

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

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

当您执行查询时:

select * from photos;

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

select * from photos order by file;

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

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

关于sql - 通过对行进行排序来优化 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1781498/

相关文章:

php - 缓慢的 PHP 脚本 - 自动调试和诊断?

python - 如何优化这个 numpy 二维排序数组的创建?

javascript - 在 JavaScript 中创建集合(相同类型的唯一元素)时,通常使用什么作为键的值?

java - 如何在多对多关系中使用 hibernate 和 JPA 删除孤立实体?

mysql - SQL中的关键字和子句有什么区别?

php - 我可以获得特定时区的时间戳吗?

mysql - 连接到本地 MySQL 服务器

mysql - MySQL 枚举性能是否比 INT 慢?

sql - "%()s"在sql查询中是什么意思?

mysql - excel mysql不读取所有select语句