sql - 查询时索引表是否比非索引表快?

标签 sql database

<分区>

假设我们有 2 个具有数百万行的相同表并且它们具有业务事务,两个表具有完全相同的信息。一列指定该行是“销售”还是“订单”,其他列指定名称(通常重复)、日期、金额、税金等....

表格中的数据没有组织,因此很明显销售和订单以及其他数据没有以任何方式排序。

唯一的区别是其中一个表有一个额外的列,该列具有其唯一的主键。

如果我使用不涉及主键的相同 WHERE 子句查询具有相同查询的表。一些查询可能涉及:WHERE action = "sale"and name = "Bob Smith"

对于 havix 索引,其中一个会比另一个更快吗??

最佳答案

每个索引都是纯粹的冗余:

  • 花费存储空间,
  • 占用缓存空间,否则可能会被其他东西占用
  • 必须在 INSERT/UPDATE/DELETE 时维护。

如果查询可以使用索引,则加速通常会大大超过上面列出的因素。反之,如果索引没有被使用,那么它就不应该存在。

但在试图删除索引和索引上的键之前,请记住如果数据不正确,性能并不重要。由于应用程序错误1,至少没有主键的表对重复行很开放,不能充当 FOREIGN KEY 的父端点,并且不能在客户端代码中合理识别其行。

要么尝试识别已经“嵌入”在您的数据中的自然主键,要么至少创建一个 surrogate key (就像您在其中一个表格中所做的那样)。


1 严格来说,这样的表甚至不代表关系,这不再是“关系”数据库。关系的数学概念是一个集合,而不是多重集合,这意味着一个元素要么在集合中,要么不在集合中,但不能多次在集合中。

关于sql - 查询时索引表是否比非索引表快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17004199/

相关文章:

php - $ sql变量声明错误

php - 确定 SQL 查询是否改变了数据库结构

mysql - Where 子句未按预期工作 : I get data from 2 different IDs when only one is specified

java - 优雅地处理 EJB/JPA 环境中的约束违规?

PHP 没有插入 MAMP phpmyadmin 上的数据库

sql - 给定一个日期如何使用经典的 asp 获取该月的第一个和最后一个日期

SQL 服务器 2000 : Limit number of rows

ruby-on-rails - 根据应用程序的启动方式设置数据库

sql - 使用 TSQL,如何判断我的 CHAR 是否是序列中的最后一个?另外,如果字母序列 "rolls over"从 'z' 到 'a' 怎么办?

php - 如何为数据库创建备份