我需要优化以下查询:
SELECT /* [things omitted] */ articles.blogpost_id, articles.id AS articleid
FROM blogposts
JOIN articles ON articles.blogpost_id = blogposts.id
WHERE blogposts.deleted = 0
AND blogposts.title LIKE '%{de}%'
AND blogposts.visible = 1
AND blogposts.date_published <= NOW()
ORDER BY blogposts.date_created DESC
LIMIT 0 , 50
Run Code Online (Sandbox Code Playgroud)
EXPLAIN SELECT 给我以下结果:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE articles ALL blogpost_id NULL NULL NULL 6915 Using temporary; Using filesort
1 SIMPLE blogposts eq_ref PRIMARY PRIMARY 4 articles.blogpost_id 1 Using where
Run Code Online (Sandbox Code Playgroud)
为什么它先是文章,然后是博客文章?是因为博客文章有更多条目吗?以及如何改进查询以便文章帖子可以使用索引? …
我最近被一个错误(在我的代码中)所困扰,其中这两个查询的运行时截然不同:
select * from smalltable st
inner join bigtable bt on st.btid = bt.btid
select * from bigtable bt
inner join smalltable st on bt.btid = st.btid
Run Code Online (Sandbox Code Playgroud)
以及单个查询在 where 过滤器中为不同的字符串寻找不同的执行计划。
是否有任何优化的、完全声明性的 SQL 标准实现,以便上述两个查询具有相同的执行计划?
目前我们有一个包含 35 个字段的表。
现在,我们需要添加 5 个额外的列,但这些列不会总是被填充。
所以,我想只添加一列并将该 id 作为另一个表中的外来 5 行或更少行取决于数据的可用性。
哪个更好
我可以理解,如果我加入“单独快速”的单个查询,组合可能会变慢,因为默认执行计划可能不是最佳的。但是,当我知道一个查询的行数非常少时,我想我应该能够使用提示来控制连接。
select cj.a, cv.b
from (select distinct a from complexJoin) cj -- 2 rows
inner loop join complexView cv
on cj.a = cv.a
order by cj.a, cv.b
Run Code Online (Sandbox Code Playgroud)
如果 cj <1s 和 cv <1s 期望这是 <~2s 但使用任何提示(合并/散列/循环)通常> 1分钟。
我还尝试使用 CROSS APPLY,因为文档声称内部选择对于每个外部行只执行一次。该查询比手动运行两次内部查询需要大约 100 倍的时间,所以也许我不理解文档。
select cj.a, cv.b
from (select distinct a from complexJoin) cj -- 2 rows
cross apply (select * from complexView
where a = cj.a) cv
order by cj.a, cv.b
Run Code Online (Sandbox Code Playgroud)
如果我用“cj”的结果填充临时表,然后加入 _with_no_hint_ 或使用交叉应用,它会很快,但我真的必须求助于它吗?如果我使用临时表并尝试“任何”连接提示(循环/合并/散列),它会很慢,所以这可能是一个关键点。
我不相信深入查询计划的深度(两者都是复杂的开始)是解决一般问题所必需的:我只想保证隔离而不诉诸临时表 - 这真的不可能?
我试图在 PostgreSQL (8.4) 中表示树结构,以便能够查询从根到给定节点的路径或查找子分支中的所有节点。
下面是一个测试表:
CREATE TABLE tree_data_1 (
forest_id TEXT NOT NULL,
node_id TEXT NOT NULL,
parent_id TEXT,
node_type TEXT,
description TEXT,
PRIMARY KEY (forest_id, node_id),
FOREIGN KEY (forest_id, parent_id) REFERENCES tree_data_1 (forest_id, node_id)
);
CREATE INDEX tree_data_1_forestid_parent_idx ON tree_data_1(forest_id, parent_id);
CREATE INDEX tree_data_1_forestid_idx ON tree_data_1(forest_id);
CREATE INDEX tree_data_1_nodeid_idx ON tree_data_1(node_id);
CREATE INDEX tree_data_1_parent_idx ON tree_data_1(parent_id);
Run Code Online (Sandbox Code Playgroud)
每个节点由(forest_id, node_id)(在另一个林中可以有另一个具有相同名称的节点)标识。每棵树都从一个根节点(其中parent_id为空)开始,尽管我只希望每个森林都有一个。
这是使用递归 CTE 的视图:
CREATE OR REPLACE VIEW tree_view_1 AS
WITH RECURSIVE rec_sub_tree(forest_id, node_id, parent_id, depth, path, cycle) …Run Code Online (Sandbox Code Playgroud) 这是我当前的查询:
SELECT BusinessID as ID,
111151.29341326*SQRT(pow(-6.186751-X(LatLong),2)+pow(106.772835-Y(LatLong),2)*0.98838574205337) AS Distance from
(
SELECT *
FROM
tableauxiliary
WHERE
MBRContains(
GeomFromText (
'MULTIPOINT(-6.1934985598076 106.76604791159,-6.1800034401924 106.77962208841)'
),
Latlong)=1
AND Prominent >15
) AS TA
Having Distance <= 18238
ORDER BY
Distance
LIMIT
0, 45
Run Code Online (Sandbox Code Playgroud)
请注意,他们我使用了子查询。它使用子查询的原因是因为我想要
MBRContains(
GeomFromText (
'MULTIPOINT(-6.1934985598076 106.76604791159,-6.1800034401924 106.77962208841)'
),
Latlong)=1
Run Code Online (Sandbox Code Playgroud)
首先要完成。这将查询时间从 19 秒减少到 0.9 秒。
有没有办法提示mysql查询优化器,这样我就不需要使用子查询
更新:
我试过:
SELECT BusinessID as ID,
111151.29341326*SQRT(pow(-6.186751-X(LatLong),2)+pow(106.772835-Y(LatLong),2)*0.98838574205337) AS Distance from tableauxiliary
USE Index (LatLong_2,FullTextSearch)
WHERE
MBRContains(
GeomFromText (
'MULTIPOINT(-6.1934985598076 106.76604791159,-6.1800034401924 106.77962208841)'
),
Latlong)
AND Prominent >15 …Run Code Online (Sandbox Code Playgroud) 我们有 14 GB 的 CSV,总计 1.38 亿行。我首先使用 InnoDB 将其导入到 MySQL 表中,然后使用 MyISAM 再次尝试。在这两种情况下,对主键(只是一个自动递增的 int)的简单 SELECT 需要 6-7 秒,尽管 MyISAM 有时在 5-6 秒时快一点。
我们只需要写一次数据,我一直在使用mysqlimport。考虑到这一点,如何提高查询速度?
...我们有 2 演出 RAM 并且一切都是一张表,这毫无价值(并且由于查询的性质,它必须保持这种状态)。考虑到硬件,这是我可以期待的最佳性能吗?或者还有什么我应该尝试的,比如压缩?或者真的,我需要更多的内存?
假设我有两个表,A并且B我知道 size(A) = size(B)。我想确认两个表中的数据是在三个给出列相同,假设他们是X,Y和Z(有在表上没有钥匙)。
为此,我会这样做:
SELECT COUNT(*) FROM
(
Select
X, Y, Z
From
A
)
MINUS
(
Select
X, Y, Z
From
B
)
Run Code Online (Sandbox Code Playgroud)
现在,我真的不需要知道count(*)值,只要数据之间存在一个不匹配,即值元组存在于A但不存在于中B,我就知道这些表不相同。有没有办法在 SQL 中说这个?即,只要 MINUS 遇到一个不匹配的值,就从查询中返回一个值来表示?
谢谢!
performance oracle query optimization minus query-performance
可能的重复:
使用 SQLCMD 运行查询与使用 SSMS 运行查询
我有许多脚本可以从不同的表中查询数据并因此更新它们。我已经定义了一个批处理文件并在 sqlcmd 命令中运行它们。似乎当我直接在 SQL management studio 中运行这些脚本时,它们的运行速度比从批处理文件中调用它们时运行得更快。
这种行为有什么原因吗?
提前致谢。
DB:MySQL 5.5.20(WampServer,默认配置)
操作系统:Win 7
HDD:Western Digital 3TB Caviar Green,3.5",IntelliPower,64MB,Sata3 (WD30EZRX)
内存:8GB
MySQL my.ini:http : //pastie.org /私人/go9kaxlmlvirati2txbaa
有问题的查询:
SELECT name.id AS name_id, name.name, cast_info.id,
cast_info.role_id, cast_info.movie_id
FROM cast_info
LEFT JOIN name ON name.id = cast_info.person_id
WHERE cast_info.movie_id = 1000000
ORDER BY cast_info.movie_id ASC
它获取所有参与特定电影的人。问题是它可能需要 0.1 秒到近 2.0 秒的时间。那太长了。当用户需要运行 10k 次时,他们不妨卸载该应用程序。甚至我都没有耐心等待它完成。
编辑:运行查询所需的时间取决于处理它的人数。每 10 人大约 0.1 秒。
解释:
**************************** 1. 行 ******************** *******
id: 1
select_type: SIMPLE
table: cast_info
type: ref
possible_keys: idx_mid,mpi
key: idx_mid
key_len: 4
ref: const
rows: 15
Extra: …
optimization ×10
mysql ×4
performance ×3
query ×2
sql-server ×2
cte ×1
hardware ×1
hints ×1
index ×1
innodb ×1
join ×1
merge ×1
minus ×1
myisam ×1
mysql-5.5 ×1
oracle ×1
postgresql ×1
sql-standard ×1
sqlcmd ×1
subquery ×1
t-sql ×1
tree ×1