标签: query-optimization

为什么UNION查询在MySQL中这么慢?

当我优化我的2个单个查询以在不到0.02秒内运行然后UNION它们时,生成的查询需要超过1秒才能运行.此外,UNION ALL比UNION DISTINCT需要更长的时间.我认为允许重复会使查询运行得更快,而不是更慢.我真的最好分开运行2个查询吗?我更愿意使用UNION.

mysql union query-optimization

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

MySQL中的!col和col = false有什么区别?

这两个陈述的表现完全不同:

mysql> explain select * from jobs  where createIndexed=false;
+----+-------------+-------+------+----------------------+----------------------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys        | key                  | key_len | ref   | rows | Extra |
+----+-------------+-------+------+----------------------+----------------------+---------+-------+------+-------+
|  1 | SIMPLE      | jobs  | ref  | i_jobs_createIndexed | i_jobs_createIndexed | 1       | const |    1 |       | 
+----+-------------+-------+------+----------------------+----------------------+---------+-------+------+-------+
1 row in set (0.01 sec)

mysql> explain select * from jobs  where !createIndexed;
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
| id | select_type | table | type | possible_keys | key …
Run Code Online (Sandbox Code Playgroud)

mysql sql query-optimization

9
推荐指数
2
解决办法
104
查看次数

索引扫描向后与索引扫描

在对具有非常高的I/O等待的服务器进行故障排除时,我注意到有很多I/O来自查询SELECT max(x) FROM t WHERE y = ?.

我的索引是btree (x, y).

我注意到查询计划执行Index Scan Backward以获得最大值.那不好吗?我应该担心这个并且可能添加另一个索引(反向)吗?或者有更好的方法来创建适合此类查询的索引吗?

postgresql query-optimization

9
推荐指数
1
解决办法
5433
查看次数

MySQL - 视图 - 超慢查询

这很奇怪.我正在尝试在MySQL中使用Views(对于具有Sybase和SQL Server的更多经验,我是MySQL的新手).无论如何,这个新项目我们都在使用MySQL,因为它似乎具有良好的性能.然而,为了简化Web前端的查询,我们决定创建一些视图,一切都运行良好,但它们需要永远运行.

视图非常简单,只是select语句(这些表中确实有几百万行).比如说这个查询:

SELECT CAST(classifier_results.msgDate as DATE) AS mdate
       ,classifier_results.objClass AS objClass
       ,COUNT(classifier_results.objClass) AS obj
       ,classifier_results.subjClass AS subjClass
       ,COUNT(classifier_results.subjClass) AS subj 
FROM classifier_results 
WHERE (classifier_results.msgDate >= (curdate() - 20)) 
GROUP BY 
  CAST(classifier_results.msgDate as DATE)
  ,classifier_results.objClass
  ,classifier_results.subjClass 
ORDER BY classifier_results.msgDate DESC
Run Code Online (Sandbox Code Playgroud)

以正常方式运行时,大约需要1.5秒才能返回结果.

但是,当此查询被放入视图(按原样)时 - 即

CREATE VIEW  V1a_sentiment_AI_current AS    
SELECT CAST(classifier_results.msgDate as DATE) AS mdate
       ,classifier_results.objClass AS objClass
       ,COUNT(classifier_results.objClass) AS obj
       ,classifier_results.subjClass AS subjClass
       ,COUNT(classifier_results.subjClass) AS subj 
FROM classifier_results 
WHERE (classifier_results.msgDate >= (curdate() - 20)) 
GROUP BY 
  CAST(classifier_results.msgDate as …
Run Code Online (Sandbox Code Playgroud)

mysql sql view query-optimization

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

如何限制SPARQL查询中特定变量的结果数?

假设我有一个像这样的SPARQL查询,寻找具有焦点资源的一些共享属性的资源,并且还获得关于焦点资源的一些其他陈述:

CONSTRUCT {
  ?focal pred:icate ?shared .
  ?other pred:icate ?shared .
}
WHERE {
  ?focal pred:icate ?shared ;
         more:info ?etc ;
         a "foobar" .
  ?other pred:icate ?shared .
}
LIMIT 500
Run Code Online (Sandbox Code Playgroud)

如果有超过500个其他资源,LIMIT可能会排除该more:info语句和对象.那么,有没有办法说"我只想要最多500个?other",或者我是否必须将此查询分成多个部分?

query-optimization sparql

9
推荐指数
1
解决办法
8056
查看次数

我如何强制sql server首先执行子查询并过滤'where'语句

我有这样的查询:

select * from (
    select * from TableX
    where col1 % 2 = 0
) subquery
where col1 % 4 = 0
Run Code Online (Sandbox Code Playgroud)

实际的子查询更复杂.当我单独执行子查询时,它可以快速返回200个,但是当我执行整个查询时,等待时间太长.

我知道sql server在这里进行了一些优化,并将where语句合并到子查询中,并产生了效率不高的新执行计划.虽然我可以深入了解执行计划并分析为什么,如索引缺失,统计数据陈旧.

但我肯定知道,我的子查询作为BaseTable将只返回一小部分数据,所以我希望所有进一步的过滤或加入只会发生在这些小部分数据中.

我的问题是,我可以强制sql server首先执行子查询,而不关心外部where语句吗?(顺便说一句,TempTable是我的最后一个选择,CTE无效)

t-sql sql-server query-optimization

9
推荐指数
2
解决办法
4775
查看次数

优化Postgres时间戳查询范围

我有以下表和索引定义:

CREATE TABLE ticket
(
  wid bigint NOT NULL DEFAULT nextval('tickets_id_seq'::regclass),
  eid bigint,
  created timestamp with time zone NOT NULL DEFAULT now(),
  status integer NOT NULL DEFAULT 0,
  argsxml text,
  moduleid character varying(255),
  source_id bigint,
  file_type_id bigint,
  file_name character varying(255),
  status_reason character varying(255),
  ...
)
Run Code Online (Sandbox Code Playgroud)

我在created时间戳上创建了一个索引,如下所示:

CREATE INDEX ticket_1_idx
  ON ticket
  USING btree
  (created );
Run Code Online (Sandbox Code Playgroud)

这是我的疑问

select * from ticket 
where created between '2012-12-19 00:00:00' and  '2012-12-20 00:00:00'
Run Code Online (Sandbox Code Playgroud)

这个工作正常,直到记录数量开始增长(约500万),现在它将永远回归.

解释分析揭示了这一点:

"Index Scan using ticket_1_idx on ticket  (cost=0.00..10202.64 rows=52543 …
Run Code Online (Sandbox Code Playgroud)

postgresql indexing query-optimization database-partitioning postgresql-performance

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

什么是自动覆盖指数?

EXPLAIN QUERY PLAN在SQLite 3中使用它有时会给我输出如

SEARCH TABLE staff AS s USING AUTOMATIC COVERING INDEX (is_freelancer=? AND sap=?) (~6 rows)
Run Code Online (Sandbox Code Playgroud)

索引来自何处以及它的作用是什么?该表没有手动创建的索引.

sqlite query-optimization sql-execution-plan

9
推荐指数
1
解决办法
2082
查看次数

MySQL索引 - 根据此表和查询的最佳实践是什么

我有这张桌子(500,000排)

CREATE TABLE IF NOT EXISTS `listings` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `type` tinyint(1) NOT NULL DEFAULT '1',
  `hash` char(32) NOT NULL,
  `source_id` int(10) unsigned NOT NULL,
  `link` varchar(255) NOT NULL,
  `short_link` varchar(255) NOT NULL,
  `cat_id` mediumint(5) NOT NULL,
  `title` mediumtext NOT NULL,
  `description` mediumtext,
  `content` mediumtext,
  `images` mediumtext,
  `videos` mediumtext,
  `views` int(10) unsigned NOT NULL,
  `comments` int(11) DEFAULT '0',
  `comments_update` int(11) NOT NULL DEFAULT '0',
  `editor_id` int(11) NOT NULL DEFAULT '0',
  `auther_name` varchar(255) DEFAULT NULL,
  `createdby_id` int(10) …
Run Code Online (Sandbox Code Playgroud)

php mysql sql indexing query-optimization

9
推荐指数
2
解决办法
1206
查看次数

Postgres 中的索引扫描与顺序扫描

我正在使用 Postgres 数据库,我试图查看 1000000 行表上的索引扫描和顺序扫描之间的区别

描述表

\d grades 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

然后解释分析 10 到 500000 之间的行

explain analyze select name from grades where pid between 10 and 500000 ; 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

然后解释分析 10 到 600000 之间的行

explain analyze select name from grades where pid between 10 and 600000 ;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

对我来说奇怪的是,为什么它在第一个查询中进行索引扫描,在第二个查询中进行顺序扫描,尽管它们通过索引中包含的同一列进行查询。

sql database postgresql indexing query-optimization

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