我知道索引本身的列顺序非常重要;但是,使用该索引的后续 SELECT 查询中的列顺序如何?
例如,如果我在 上有一个多列索引[:col_1, :col_2, :col_3],我的 SELECT 语句是否需要看起来像"SELECT * FROM my_table WHERE col_1 = (?), col_2 = (?), col_3 = (?)"以便优化查询?或者我可以按任何顺序指定参数并且查询优化器会处理它?
我已经阅读了一些 类似的答案,但似乎没有一个明确的答案指向文档,并相对于索引进行了回答。一些答案说“没关系”或“效果可以忽略不计”。
我正在 PostgreSQL 上使用 RoR/ActiveRecord,但问题确实适用于任何 SQL/关系数据库。
是否可以从架构内的所有表中进行选择?我得到了所有的表名
select table_name from information_schema.tables
但我无法使用它来进行查询。
我正在研究跟踪使用时间的分析系统的架构,并且需要查看特定日期范围内的总使用时间。
举一个简单的例子,这种类型的查询会经常运行:
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) 我想要一个表中至少有一个非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条目的列呢?
这是如何有效的语句(其中 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 子句中或用于聚合函数中
小提琴。
问题是为什么第一个是合法查询,即为什么按主键分组是有效的?
对于大型数据集,使用 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游标,游标的唯一唯一顺序标识符是表行上的uuid和created_at。
我们当然可以根据 查询uuid得到created_at,然后选择所有的users,<= created_at但问题是如果表中有多个相同created_at时间戳的实例users怎么办?知道如何users根据uuid/created_at游标组合查询表以确保我们获得正确的数据集(就像我们使用自动递增一样id)?再次,只有独特的领域是uuid因为created_at可能是重复的,但他们的组合是每行唯一的。
看起来我的问题很不寻常,因为我根本没有找到答案。让我们想象一下,我有一个A带有列的表:language和uri。
语言 | uri ----------|----------------- 茹 | 一些uri zh | 另一个uri ...
我的问题是:如何返回 JSON 对象而不是多行。例如:
{
"ru": "some-uri",
"en": "some-another-uri",
...
}
在我工作的项目中,用于选择对象的 sql 总是选择更新,无论上下文是否为事务。
我的问题是它是否有任何风险、性能问题、或导致死锁或其他顽皮的可能性?
我知道 select for update 只能在事务内锁定一行,这是常见的用例。
我提供了以下两个具体用例,无论是否在事务内部,都在选择更新后使用。
book = booksRepository->getBook(7);
return book;
Run Code Online (Sandbox Code Playgroud)
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,所以我们只选择始终进行更新”...
该答案没有为我可以学习的地方提供任何见解或解释,所以我在这里问。
我正在处理一个相当古老的 .NET 项目,并引入了一些新功能(在顶部),这些功能产生了以下副作用:所有生成的 SELECT(或组)都包含在BEGIN TRAN ... COMMIT语句中。
这听起来很愚蠢,但要摆脱它需要进行大量更改,而我负担不起。我的假设是这基本上意味着每组 SELECT 的小开销(应用程序和 SQL Server 之间的 BEGIN TRAN 和 COMMIT)。
我想知道是否还有更多内容(额外锁定?)。
问题:如果选择语句包含在 BEGIN TRAN ... COMMIT 中,是否有任何副作用?
这个问题非常接近我想问的问题,但问题和答案都更侧重于选择随机行。
由于一般规则是始终推荐“SELECT COLUMN_LIST”而不是“SELECT *”,我想知道推荐是否随以下场景而变化。
场景: 从一个大约有 5 列的表中,如果我需要这 5 列的信息,但在不同的步骤,
例如:就像在 Java 函数中一样,在第 1 步中,将使用前 2 列,在第 4 步中,将使用第 3 列和第 4 列,在第 10 步中将使用第 5 列。
有两种方法可以获取这些信息,
对于上述场景,推荐使用 2 种方式中的哪一种?
select ×10
mysql ×5
postgresql ×4
index ×2
cursors ×1
group-by ×1
json ×1
locking ×1
myisam ×1
mysql-5.7 ×1
null ×1
optimization ×1
paging ×1
performance ×1
sql-server ×1
transaction ×1