标签: select

使用复合索引时,SELECT 查询中的字段顺序是否重要?

我知道索引本身的列顺序非常重要;但是,使用该索引的后续 SELECT 查询中的列顺序如何?

例如,如果我在 上有一个多列索引[:col_1, :col_2, :col_3],我的 SELECT 语句是否需要看起来像"SELECT * FROM my_table WHERE col_1 = (?), col_2 = (?), col_3 = (?)"以便优化查询?或者我可以按任何顺序指定参数并且查询优化器会处理它?

我已经阅读了一些 类似的答案,但似乎没有一个明确的答案指向文档,并相对于索引进行了回答。一些答案说“没关系”或“效果可以忽略不计”。

我正在 PostgreSQL 上使用 RoR/ActiveRecord,但问题确实适用于任何 SQL/关系数据库。

postgresql index optimization select

8
推荐指数
1
解决办法
2557
查看次数

从 PostgreSQL 模式内的所有表中进行选择

是否可以从架构内的所有表中进行选择?我得到了所有的表名

select table_name from information_schema.tables

但我无法使用它来进行查询。

postgresql select

8
推荐指数
1
解决办法
3万
查看次数

优化 MySQL SELECT 语句中 TIMESTAMP 字段的 WHERE 条件

我正在研究跟踪使用时间的分析系统的架构,并且需要查看特定日期范围内的总使用时间。

举一个简单的例子,这种类型的查询会经常运行:

select sum(diff_ms) from writetest_table where time_on > ("2015-07-13 15:11:56");
Run Code Online (Sandbox Code Playgroud)

此查询通常需要大约 7 秒的时间在一个人口密集的表上。它有大约 3500 万行,MyISAM on MySQL 在 Amazon RDS (db.m3.xlarge) 上运行。

去掉 WHERE 子句使查询只需要 4 秒,添加第二个子句 (time_off > XXX) 增加了 1.5 秒,使查询时间达到 8.5 秒。

因为我知道这些类型的查询会很常见,所以我想优化一些东西,使它们更快,理想情况下低于 5 秒。

我首先在 time_on 上添加一个索引,虽然这大大加快了 WHERE "=" 查询,但它对 ">" 查询没有影响。有没有办法创建一个可以加速 WHERE ">" 或 "<" 查询的索引?

或者如果对此类查询的性能有任何其他建议,请告诉我。

注意:我使用“diff_ms”字段作为非规范化步骤(它等于 time_off - time_on),它将聚合性能提高了大约 30%-40%。

我正在使用以下命令创建索引:

ALTER TABLE writetest_table ADD INDEX time_on (time_on) USING BTREE;
Run Code Online (Sandbox Code Playgroud)

在原始查询上运行“explain”(使用“time_on >”)表示 time_on 是一个“possible_key”,而 select_type 是“SIMPLE”。“额外”列显示“使用位置”,“类型”为“全部”。添加索引后,该表显示“time_on”是“MUL”键类型,这似乎是正确的,因为同一时间可以出现两次。

这是表架构:

CREATE TABLE `writetest_table` (
  `id` …
Run Code Online (Sandbox Code Playgroud)

mysql myisam performance index select

8
推荐指数
1
解决办法
3万
查看次数

选择条目不为空的列名

我想要一个表中至少有一个非NULL数据条目的那些列的列表。

换句话说,我想获取以下返回至少一个条目的列名称:

SELECT DISTINCT column_name FROM table WHERE column_name IS NOT NULL
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法:

SELECT column_name
FROM information_schema.columns
WHERE table_name = "table_name"
AND EXISTS (
    SELECT DISTINCT column_name FROM table_name WHERE column_name IS NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

但这也会返回所有条目所在的列名NULL

那么如何只获取那些没有NULL条目的列呢?

mysql null database-design select

7
推荐指数
1
解决办法
8万
查看次数

为什么按主键分组时可以选择所有字段,而按另一列分组时却不能选择所有字段

这是如何有效的语句(其中 id 是表的主键):

select * from table group by id ;
Run Code Online (Sandbox Code Playgroud)

这不是:

select * from table group by name ;
Run Code Online (Sandbox Code Playgroud)

错误:列“pgluster.id”必须出现在 GROUP BY 子句中或用于聚合函数中

小提琴

问题是为什么第一个是合法查询,即为什么按主键分组是有效的?

postgresql select group-by

7
推荐指数
1
解决办法
1万
查看次数

MySQL - 基于 UUID/created_at 游标的分页?

对于大型数据集,使用 an 进行分页OFFSET是众所周知的,并且不是最好的分页方式。更好的分页方式是使用游标,它只是行上的一个唯一标识符,因此我们知道从最后一个光标位置上次离开的位置继续分页的位置。

当涉及到一个自动递增id值的游标时,实现起来相当容易:

SELECT * FROM users
WHERE id <= %cursor // cursor is the auto incrementing id, ex. 100000
ORDER BY id DESC
LIMIT %limit
Run Code Online (Sandbox Code Playgroud)

我们不确定的是,如果不是自动递增id游标,游标的唯一唯一顺序标识符是表行上的uuidcreated_at

我们当然可以根据 查询uuid得到created_at,然后选择所有的users<= created_at但问题是如果表中有多个相同created_at时间戳的实例users怎么办?知道如何users根据uuid/created_at游标组合查询表以确保我们获得正确的数据集(就像我们使用自动递增一样id)?再次,只有独特的领域是uuid因为created_at可能是重复的,但他们的组合是每行唯一的。

mysql cursors select paging mysql-5.7

7
推荐指数
2
解决办法
5594
查看次数

多行到json

看起来我的问题很不寻常,因为我根本没有找到答案。让我们想象一下,我有一个A带有列的表:languageuri

语言 | uri             
----------|-----------------
茹 | 一些uri        
zh | 另一个uri
...

我的问题是:如何返回 JSON 对象而不是多行。例如:

{ "ru": "some-uri", "en": "some-another-uri", ... }

postgresql select json

7
推荐指数
2
解决办法
8951
查看次数

SELECT ... FOR UPDATE 在 MySQL 中的事务范围之外是否有任何风险?

在我工作的项目中,用于选择对象的 sql 总是选择更新,无论上下文是否为事务。

我的问题是它是否有任何风险、性能问题、或导致死锁或其他顽皮的可能性?

我知道 select for update 只能在事务内锁定一行,这是常见的用例。

我提供了以下两个具体用例,无论是否在事务内部,都在选择更新后使用。

用例 1 - 只需选择一本书并将其归还

book = booksRepository->getBook(7);
return book;
Run Code Online (Sandbox Code Playgroud)

用例 2 - 交易,选择图书,检查是否有效,如果有效则更新

bookRepository->startTransaction();
book = booksRepository->getBook(7);
if (//some condition with the book properties) {
   bookRepository->updateBookAuthor(7, 'bbb');
}
bookRepository->commitTransaction();
Run Code Online (Sandbox Code Playgroud)

在上面的两个例子中,存储库中的函数 getBook 确实选择更新

SELECT * FROM BOOKS
WHERE id = :id
FOR UPDATE;
Run Code Online (Sandbox Code Playgroud)

我问了其他开发人员,他们为什么这样做的答案是“因为否则我们将不得不在存储库中创建两个函数,一个 getBook 和一个 getBookForUpdate,所以我们只选择始终进行更新”...

该答案没有为我可以学习的地方提供任何见解或解释,所以我在这里问。

mysql select locking

7
推荐指数
1
解决办法
4992
查看次数

如果选择语句包含在 BEGIN TRAN ... COMMIT 中,是否有任何副作用?

我正在处理一个相当古老的 .NET 项目,并引入了一些新功能(在顶部),这些功能产生了以下副作用:所有生成的 SELECT(或组)都包含在BEGIN TRAN ... COMMIT语句中。

这听起来很愚蠢,但要摆脱它需要进行大量更改,而我负担不起。我的假设是这基本上意味着每组 SELECT 的小开销(应用程序和 SQL Server 之间的 BEGIN TRAN 和 COMMIT)。

我想知道是否还有更多内容(额外锁定?)。

问题:如果选择语句包含在 BEGIN TRAN ... COMMIT 中,是否有任何副作用?

sql-server transaction select sql-server-2016

7
推荐指数
1
解决办法
206
查看次数

推荐方式:“SELECT *”与“SELECT COLUMN_LIST”来自同一个表,多次

这个问题非常接近我想问的问题,但问题和答案都更侧重于选择随机行。

由于一般规则是始终推荐“SELECT COLUMN_LIST”而不是“SELECT *”,我想知道推荐是否随以下场景而变化。

场景: 从一个大约有 5 列的表中,如果我需要这 5 列的信息,但在不同的步骤,

例如:就像在 Java 函数中一样,在第 1 步中,将使用前 2 列,在第 4 步中,将使用第 3 列和第 4 列,在第 10 步中将使用第 5 列。

有两种方法可以获取这些信息,

  1. 使用“SELECT *”进行 1 次数据库调用,并在相应步骤中提取所需信息。
  2. 进行多次数据库调用,在步骤 1、步骤 4 和步骤 10 中使用“SELECT COLUMN_LIST”,在每次调用中仅获取所需列的数据。

对于上述场景,推荐使用 2 种方式中的哪一种?

mysql select query-performance

7
推荐指数
1
解决办法
966
查看次数