问题标签 [database-indexes]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
database - 给定一个查询,你怎么知道要添加哪些索引?
有什么工具可以做到这一点吗?你给它一个 SQL 查询,它会给出建议。例如,我正在尝试优化以下查询:
解释
我们应该如何解释该输出?
ruby-on-rails - rename_column 是否处理索引?
说,我们有这样的事情:
然后我们做
ActiveRecord 和/或数据库是否也会处理索引的重命名,还是我必须手动删除索引并再次添加它?
mysql - MySQL 优化:EXPLAIN “Extra”列包含“Using Where”
所以我一直认为在 Extra 栏中看到“Using Where”是一件好事。但是,我正计划为我的同事准备一份棕色袋子午餐,以解释解释,现在我不太确定。MySQL 文档在关于“Using Where”的注释中这么说:
WHERE 子句用于限制与下一个表匹配或发送到客户端的行。除非您特别打算从表中获取或检查所有行,否则如果 Extra 值不是 Using where 并且表连接类型是 ALL 或索引,则您的查询可能有问题。即使您对 WHERE 子句的所有部分都使用索引,您也可能会看到使用 where 如果列可以为 NULL。
这让我相信即使我的 WHERE 子句只包含索引的一部分,如果列可以具有 NULL 值,MySQL 仍然会检查行。
真的吗?如果是这样,如果不需要,我应该将列更改为不包含 NULL 吗?我会看到速度提升吗?
mysql - MySQL SELECT IN() 语句和 InnoDB 索引失败
我有一个这样做的查询:
我还在 parent_id 列上设置了一个索引。
当我对查询进行 EXPLAIN SELECT 检查时,我得到以下信息:
看起来没有键用于索引的 where 子句。但是,当我做一个简单的 parent_id = 4 时,它就可以了。但是当我执行 parent_id=4 或 parent_id=5 时,它会显示相同的消息。
我发现它与 innoDB 数据库表类型有关。当在特定数据库引擎上执行 IN 操作时,MySQL 似乎不喜欢它。这可能是 EXPLAIN 工具的问题,还是 InnoDB 缺少的东西?
oracle - 如何通过 JDBC 获取 Oracle 表中的所有索引,即使它们由不同的用户拥有?
是的,我知道,DatabaseMetadata.getIndexInfo
但它似乎没有做我想要的。
我有两个用户/模式,我们称他们A
为B
.
有一个表A
被调用TAB
。用户B
在 上创建了一个索引A.TAB
,我们称之为索引IND
。
我想要TAB
的信息是:架构中的表上有哪些索引A
(也就是 owner A
)。我不关心索引的所有者,只关心它们在那个特定的表上。
通过实验,getIndexInfo
我发现了以下几点:
catalog
Oracle JDBC 驱动程序似乎完全忽略了第一个参数。- 第二个参数
schema
限制返回哪些表统计信息 以及 索引的所有者 unique
并approximate
(大致)做他们应该做的(除了给予approximate=false
将实际执行更新统计语句)。
跟踪 JDBC 驱动程序在其上执行的 SQL 后getIndexInfo(null, "A", "TAB", false, true)
,我得到了这个:
如您所见,两者都 table_name
被 i.owner
限制为TAB
. 这意味着此查询将仅返回与表相同的用户拥有的索引信息。
我可以想到三种可能的解决方法:
- 始终在相同的模式中创建索引和表(即让它们具有相同的所有者)。不幸的是,这并不总是一种选择。
- 查询
schema
设置为null
。一旦两个模式包含相同的表名,这将变得很难看(因为没有办法找出给定模式在哪个表(即哪个表所有者)上)。 - 直接执行该 SQL(使用
executeQuery()
)。我宁愿不要跌到这个水平,除非它是绝对不可避免的。
这些变通方法对我来说都不是特别令人满意,但如果没有其他方法可行,我可能不得不退回到直接 SQL 执行。
数据库和 JDBC 驱动程序都位于 11.2.0.2.0。
所以基本上我的问题是:
- 这是 JDBC 驱动程序中的错误,还是背后有一些我不知道的逻辑?
- 是否有一种简单且可移植的方式让 Oracle 为我提供所需的信息?
database - 关于数据库索引的问题
- 当为字段上的唯一约束创建数据库索引或为多个字段唯一约束创建多个索引时,这些相同的索引是否能够在查询对象时用于提高效率,就像任何其他数据库索引一样用来?我的猜测是,为唯一约束创建的索引与为提高效率而创建的索引相同,唯一约束本身是额外的,但我并不精通数据库。
- 是否有可能通过长事务和高并发等以任何方式打破唯一约束,包括多字段约束(例如 field_a 和 field_b 是唯一的)?或者,唯一约束是否提供 100% 的保护。
mysql - 针对两个整数列的查询花费了荒谬的时间
我有一个查询(由 Django 生成),如下所示:
它查询包含 134189 个条目的 GeoLocating 表。添加索引时,每个查询都需要超过 100 毫秒的时间来执行,这使得它无法用于不止一次的事情。我将缓存响应,因此我只需要进行一次 IP 查找,但我很好奇我是否遗漏了一些明显的方法来使其速度更快。我的桌子:
在两列上创建索引,如下所示:
给出以下解释:
完成选择需要超过 100 毫秒:
比拥有单个索引更昂贵:
完成这些请求大约需要 100 毫秒:
但这两种方法都需要太长时间,有可能对此做些什么吗?
mysql - MySQL - 使用聚合函数加速查询的索引
据我了解,典型数据库表上的索引将提供更有效的行查找。是否存在类似的构造来使使用聚合函数的查询更有效?
例如,假设我有一个像下面这样的表,其中包含大量行
我想有效地检索MAX()
每个办公室员工的工资。在这种情况下,我不介意额外的插入/更新开销,因为我会经常进行此查询,而不是经常写入表。
我的引擎是 MySQL 上的 MyISAM
mysql - 如何索引此表(a_level、b_level、item_id)
我有一个项目表,每个项目都有一个 a_level、b_level 和一个 item_id。任何 b_level 仅专用于一个 a_level(例如:b_level 14 仅是 a_level 2 的“子级”)
假设我们有数百万个项目,所有项目都插入一次,然后只请求 SELECT。
如果我根据 item_id 选择一个项目,那么我需要索引 item_id 列。这将使 MySQL 查看所有数百万个项目,这很糟糕,因为我已经有了 a_level 和 b_level 信息。所以我想如果我根据特定级别选择一个项目并且我在该列上有一个索引,那么 MySQL 将不必查看所有数百万个项目,只需查看具有该特定级别的项目。
如果我在 a_level、b_level(当然还有 item_id)和 SELECT WHERE a_level= b_level= item_id= 上都进行索引,会不会很糟糕?我想只有 b_level 和 item_id 上的 INDEX 和 SELECT WHERE b_level= AND item_id= 就足够了/最好的解决方案?
所以,因为我有 a_level 和 b_level(我所说的任何 b_level 都是只有一个 a_level 的“子级”),为拾取物品而创建的最有效的 SELECT 和 INDEX 是什么?
python - Django:unique_together 是否以与 ForeignKey 相同的方式暗示 db_index=True?
模型上的一个字段,foo = models.ForeignKey(Foo)
会自动为该列添加一个数据库索引,以使查找更快。这很好,但是 Django 的文档没有说明模型元中的字段是否unique_together
接受相同的处理。我碰巧有一个模型,其中列出的一个 char 字段unique_together
需要一个索引以进行快速查找。我知道db_index=True
在字段定义中添加重复项不会有任何伤害,但我很好奇。