标签: query-optimization

在 WHERE 子句中使用的所有列上创建索引是一个好习惯吗

该表存储时间序列数据并包含大约 15 列。我想优化SELECT在 3 列上有过滤器的查询

SELECT * FROM TABLE_1
WHERE COL_1 = ? 
  AND COL_2 = ? 
  AND COL_3 = ?
Run Code Online (Sandbox Code Playgroud)

COL_1在和上创建了 2 个索引COL_2,但在 上没有创建COL_3。当 RPS(每秒请求数)约为 1K 时,数据库 CPU 峰值达到100% 。

数据库配置是

  1. 8 个 CPU
  2. 16 GB 内存
  3. 250 GB 存储空间

由于没有索引,查询处理是否更多COL_3?在子句中使用的每个列上创建索引是一个好习惯吗WHERE

postgresql indexing query-optimization cpu-usage timescaledb

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

为什么这个执行计划中排序运算符的成本如此之高?

执行计划

Sort运算表示只有 100 行需要排序。这怎么可能比读取 190 万行更昂贵呢?我一定是读错了或者误解了某些东西。

另外,排序运算符中每次执行的估计行数为何只有 100?如果Index Seek运算符估计每次执行的行数为 190 万行,那么如何仅将 100 行传送到 Sort 运算符呢?

这是查询:

    DECLARE @PageIndex INT = 1000;
    DECLARE @PageCount INT  = 1000;

    SELECT  ID
    FROM    dbo.Table1
    WHERE DateCreated >= '2021-10-27'
            AND
        DateCreated < '2021-10-28'
    ORDER BY ID
        OFFSET @PageIndex * @PageCount ROWS FETCH NEXT @PageCount ROWS ONLY 
Run Code Online (Sandbox Code Playgroud)

sql-server query-optimization

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

如何让查询更快?

我的tracks表包含大约 300 万条记录(每天增长 500 条),大约有 30 列,但我只在WHERE子句中使用 15 列。查询平均需要 4800 毫秒,没有其他用户/进程使用数据库。如何让它更快?我希望看到接近 100 毫秒的结果。

寻找歌曲(曲目)的人填写表格:

  • string -> 代表“歌曲标题或艺术家姓名”
  • 字符串 -> 代表“流派”
  • 日期 -> 表示“发布时间”
  • 剩余 12 个参数的最小/最大的几个整数

99% 的用例是 SELECT 查询:

SELECT
    "public"."tracks"."sys_id",
    "public"."tracks"."all_artists",
    "public"."tracks"."name",
    "public"."tracks"."genres",
    "public"."tracks"."release_date",
    "public"."tracks"."tempo",
    "public"."tracks"."popularity",
    "public"."tracks"."danceability",
    "public"."tracks"."energy",
    "public"."tracks"."speechiness",
    "public"."tracks"."acousticness",
    "public"."tracks"."instrumentalness",
    "public"."tracks"."liveness",
    "public"."tracks"."valence",
    "public"."tracks"."main_artist_popularity",
    "public"."tracks"."main_artist_followers",
    "public"."tracks"."key",
    "public"."tracks"."preview_url"
FROM
    "public"."tracks"
WHERE
    (
    "public"."tracks"."name" LIKE '%oultec%'
    OR "public"."tracks"."all_artists_string" LIKE '%oultec%'
    )
    AND ("public"."tracks"."genres_string" LIKE '%rum%')
    AND "public"."tracks"."tempo" >= '80'
    AND "public"."tracks"."tempo" <= '210'
    AND "public"."tracks"."popularity" >= …
Run Code Online (Sandbox Code Playgroud)

sql postgresql full-text-search query-optimization trigram

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

调试 PostgreSQL 触发性能

我有一个缓慢的删除查询。我曾经EXPLAIN ANALYZE了解瓶颈,我看到两个触发器很慢:

Trigger for constraint other_table_1_fid_fkey: time=3.644 calls=1
Trigger for constraint other_table_2_fid_fkey: time=6.289 calls=1
Run Code Online (Sandbox Code Playgroud)

在这次讨论之后,我添加了索引。索引fid确实other_table_1提高了性能。fid但是在in上添加索引并other_table_2没有任何区别,而且它似乎是delete查询中的瓶颈。

我的问题是如何调试(或EXPLAIN ANALYZE)触发器本身。

谢谢,

PS 为了解决我的具体问题,我暂时删除了外键约束,它提高了性能。

postgresql cascade query-optimization

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

什么是MySQL索引表?

我需要加快查询速度.索引表是我正在寻找的吗?如果是这样,我该怎么做?每次插入都需要更新吗?

以下是表格模式:

--table1--   |   --tableA--   |    --table2--
id           |   id           |    id
attrib1      |   t1id         |    attrib1
attrib2      |   t2id         |    attrib2
             |   attrib1      |
Run Code Online (Sandbox Code Playgroud)

和查询:

SELECT 
  table1.attrib1, 
  table1.attrib2,
  tableA.attrib1 
FROM 
  table1,
  tableA
WHERE 
  table1.id = tableA.t1id
  AND (tableA.t2id = x or ... or tableA.t2id = z)
GROUP BY 
  table1.id
Run Code Online (Sandbox Code Playgroud)

mysql sql indexing query-optimization

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

SQL:LEFT OUTER JOIN的帮助

看来我的SQL不是基于的限制结果price.

在我之前的帖子中,SQL:帮助我优化我的SQL,人们表示我应该使用LEFT OUTER JOIN.

SELECT homes.home_id, 
    address, 
    city, 
    state, 
    zip, 
    price, 
    photo_id, 
    photo_url_dir
FROM homes
LEFT OUTER JOIN home_photos ON homes.home_id = home_photos.home_id
AND primary_photo_group_id = home_photo_group_id
AND home_photo_type_id =2
AND display_status = true
AND homes.price BETWEEN 500000 AND 1000000
Run Code Online (Sandbox Code Playgroud)

但是,它仍然显示价格<500000的房屋

我不明白.当我有一个WHERE条件来精确限制该字段时,为什么上面的SQL会显示价格低于500000的房屋.

谢谢你的帮助.

我想做的事

我希望根据PRICEX和Y之间的标准显示家庭和家庭没有home_photo ...或者SQFTZ.但是这些标准需要应用于那些有和homes没有a的家庭.home_photo

它是否正确?

SELECT homes.home_id, 
    address, 
    city, 
    state, 
    zip, 
    price, 
    photo_id, 
    photo_url_dir
FROM homes
LEFT OUTER JOIN home_photos ON homes.home_id = home_photos.home_id
    AND homes.primary_photo_group_id = …
Run Code Online (Sandbox Code Playgroud)

sql database database-design query-optimization

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

使用另一个表从表中删除记录?

注意:编辑:请编辑标题,如果有更好的:)

我的问题是:

我的数据库中有两个表

     -----------
     | table1   |
     |----------|
     | id       |
     |text      |
     ===========


     -----------
     | table2   |
     |----------|
     | id       |
     |text      |
     ===========
Run Code Online (Sandbox Code Playgroud)

table1是600,000条记录

table2是5,000,000条记录!! :)

删除table2中不在table1中的所有记录的最佳方法是什么

我主要是顺便 - 最快的方式,因为我不想等待4个小时来完成这个过程

你有比以下代码更好的东西:

<?PHP
   $sql = "select text from table2";
   $result = mysql_query($sql) or die(mysql_error());
   while($row = mysql_fetch_array($result)){
        $text = $row["text"];
        $sql2 = "select id from table1 where text = '$text'";
        $query2 = mysql_query($sql2) or die(mysql_error());
        $result2 = mysql_num_rows($query2);
        if($result2==0){
             $sql3 = "delete from table2 where text = '$text'";
             $query3 …
Run Code Online (Sandbox Code Playgroud)

php mysql database optimization query-optimization

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

优化MySQL查询

我们有一个查询当前正在查杀我们的数据库,我知道必须有一种方法来优化它.我们有3个表:

  1. items - 项目表,其中每个项目都有关联的object_id,length,difficulty_rating,rating,avg_rating和status
  2. lists - 列表,基本上是我们用户创建的项目列表
  3. list_items - 包含2列的表:list_id,item_id

我们一直在使用以下查询来显示一个简单的HTML表,该表显示每个列表以及与列表相关的一些属性,包括所包含列表项的属性的平均值:

select object_id, user_id, slug, title, description, items, 
       city, state, country, created, updated,
       (select AVG(rating) from items
          where object_id IN 
              (select object_id from list_items where list_id=lists.object_id) 
            AND status="A"
       ) as 'avg_rating',
       (select AVG(avg_rating) from items
          where object_id IN 
              (select object_id from list_items where list_id=lists.object_id) 
            AND status="A"
       ) as 'avg_avg_rating',
       (select AVG(length) from items 
          where object_id IN 
              (select object_id from list_items where list_id=lists.object_id) 
            AND status="A"
       ) as 'avg_length',
       (select AVG(difficulty_rating) from …
Run Code Online (Sandbox Code Playgroud)

mysql optimization query-optimization

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

哪两个查询会更快?

SELECT * FROM table WHERE col IN (1,2,3)
Run Code Online (Sandbox Code Playgroud)

要么

SELECT * FROM table WHERE col = 1 OR col = 2 OR col = 3
Run Code Online (Sandbox Code Playgroud)

sql query-optimization

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

用我的SQL查询帮助我(需要它总是返回至少一行.)

首先,这是我的SQL查询:

SELECT research_cost, tech_name,
    (SELECT research_cost
        FROM technologies
        WHERE research_cost <= USERS_RESEARCH_POINTS_VALUE
        ORDER BY research_cost DESC
        LIMIT 1) as research_prev,
    (SELECT cost
        FROM technology_costs
        WHERE id = 18
        LIMIT 1) as technology_cost
FROM `technologies`
    JOIN technology_costs
    ON id = COUNT_OF_TECHS_USER_LEARNED
WHERE research_cost > USERS_RESEARCH_POINTS_VALUE
ORDER BY research_cost ASC
LIMIT 1
Run Code Online (Sandbox Code Playgroud)

网站链接:http://www.joemajewski.com/fortress/

有些人可能会认为上面的查询是中等大小的,甚至是小的; 不是我.对我来说,这是我写过的最大,最复杂的SQL查询之一,所以我把自己推到了极限.

无论如何,查询本身没有语法错误,并且在大多数情况下它完全符合我的要求.然而,有一个小问题.

如果main SELECT子句没有返回一行("SELECT research_cost,tech_name FROM technologiesWHERE research_cost> whatever"),则整个查询都是空集.

如果有帮助,Fortress就是我正在努力的游戏.这是一个基于浏览器的MMORPG,用户可以在这里建立一支军队,试图在排行榜中占据一席之地.技术是一种游戏机制,用户购买其统计数据(黄金收入,单位生产等)的升级.研究是一种游戏机制,允许您通过培训科学家来进行研究来学习新技术.这就是这个查询的全部内容.它抓住了目前正在研究的技术,以及它的研究成本.它还可以获得下一项技术成本的黄金成本.

所以...有什么方法可以强制在结果集中至少返回一个空行,因为嵌套的select语句检索脚本中需要的变量,即使外部查询没有返回任何内容.或者有人可能会改变它,以便始终返回结果.

如果需要其他任何东西,请告诉我.:)

mysql sql optimization resultset query-optimization

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