标签: optimization

MySQL:加入未使用的表时的索引(性能优化问题)

我需要优化以下查询:

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)

为什么它先是文章,然后是博客文章?是因为博客文章有更多条目吗?以及如何改进查询以便文章帖子可以使用索引? …

mysql performance index query optimization

6
推荐指数
1
解决办法
6626
查看次数

是否有任何完全声明式的 SQL 实现

我最近被一个错误(在我的代码中)所困扰,其中这两个查询的运行时截然不同:

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 标准实现,以便上述两个查询具有相同的执行计划?

optimization sql-standard

6
推荐指数
1
解决办法
161
查看次数

我们应该添加额外的 5 列还是构建一个单独的表?

目前我们有一个包含 35 个字段的表。

现在,我们需要添加 5 个额外的列,但这些列不会总是被填充。

所以,我想只添加一列并将该 id 作为另一个表中的外来 5 行或更少行取决于数据的可用性。

哪个更好

  • 添加列?
  • 添加一个新表?

database-design optimization

6
推荐指数
2
解决办法
3993
查看次数

如何使用合并提示隔离 SQL Server 中的复杂查询

我可以理解,如果我加入“单独快速”的单个查询,组合可能会变慢,因为默认执行计划可能不是最佳的。但是,当我知道一个查询的行数非常少时,我想我应该能够使用提示来控制连接。

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_ 或使用交叉应用,它会很快,但我真的必须求助于它吗?如果我使用临时表并尝试“任何”连接提示(循环/合并/散列),它会很慢,所以这可能是一个关键点。

我不相信深入查询计划的深度(两者都是复杂的开始)是解决一般问题所必需的:我只想保证隔离而不诉诸临时表 - 这真的不可能?

join sql-server optimization hints merge

6
推荐指数
1
解决办法
1010
查看次数

PostgreSQL 树结构和递归 CTE 优化

我试图在 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)

postgresql performance tree optimization cte

6
推荐指数
1
解决办法
5641
查看次数

有没有办法向 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
(
    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)

mysql optimization subquery

6
推荐指数
2
解决办法
1990
查看次数

为只读优化 MySQL?

我们有 14 GB 的 CSV,总计 1.38 亿行。我首先使用 InnoDB 将其导入到 MySQL 表中,然后使用 MyISAM 再次尝试。在这两种情况下,对主键(只是一个自动递增的 int)的简单 SELECT 需要 6-7 秒,尽管 MyISAM 有时在 5-6 秒时快一点。

我们只需要写一次数据,我一直在使用mysqlimport。考虑到这一点,如何提高查询速度?

...我们有 2 演出 RAM 并且一切都是一张表,这毫无价值(并且由于查询的性质,它必须保持这种状态)。考虑到硬件,这是我可以期待的最佳性能吗?或者还有什么我应该尝试的,比如压缩?或者真的,我需要更多的内存?

mysql innodb myisam optimization hardware

6
推荐指数
1
解决办法
4312
查看次数

优化比较查询

假设我有两个表,A并且B我知道 size(A) = size(B)。我想确认两个表中的数据是在三个给出列相同,假设他们是XYZ(有在表上没有钥匙)。

为此,我会这样做:

 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

6
推荐指数
1
解决办法
1899
查看次数

使用sqlcmd查询性能

可能的重复:
使用 SQLCMD 运行查询与使用 SSMS 运行查询

我有许多脚本可以从不同的表中查询数据并因此更新它们。我已经定义了一个批处理文件并在 sqlcmd 命令中运行它们。似乎当我直接在 SQL management studio 中运行这些脚本时,它们的运行速度比从批处理文件中调用它们时运行得更快。

这种行为有什么原因吗?

提前致谢。

sql-server-2008 sql-server optimization t-sql sqlcmd

6
推荐指数
1
解决办法
1791
查看次数

优化大表上的简单查询

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.movi​​e_id
FROM cast_info
LEFT JOIN name ON name.id = cast_info.person_id
WHERE cast_info.movi​​e_id = 1000000
ORDER BY cast_info.movi​​e_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: …

mysql optimization mysql-5.5

6
推荐指数
1
解决办法
4693
查看次数