AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-37635

vfsoraki's questions

Martin Hope
vfsoraki
Asked: 2020-07-01 03:50:26 +0800 CST

Mariadb 没有使用正确的索引

  • 0

小提琴:https ://www.db-fiddle.com/f/m4vsq4ERyBhiBNdZqALMVP/0

我有两个索引,一个 forsome_other_id和一个 for created_at , some_other_id。

选择查询使用生产服务器上的第一个索引(~23M 行),而它使用我的开发机器上的第二个索引(1 行)。

服务器说明:

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: symbol_details
         type: ref
possible_keys: symbol_details_some_other_id_index,symbol_details_created_at_some_other_id_index
          key: symbol_details_some_other_id_index
      key_len: 8
          ref: const
         rows: 24152
        Extra: Using where

开发说明:

           id: 1
  select_type: SIMPLE
        table: symbol_details
         type: range
possible_keys: symbol_details_some_other_index,symbol_details_created_at_some_other_id_index
          key: symbol_details_created_at_some_other_id_index
      key_len: 5
          ref: NULL
         rows: 1
        Extra: Using where; Using index

同样在小提琴中,它没有使用第二个索引,而显然对created_at.

是因为行数吗?

我想在生产中使用这样的查询,但是这样太慢了。像这样的单个查询会返回约 23M 行中的约 100 行,我认为第二个索引会涵盖此查询,但它似乎以某种方式没有。

关于如何使用索引的任何想法,或为此查询创建另一个索引,或修改查询以使用索引。

最好的解决方案是不触及查询,因为它是由 ORM 生成的。在使用 ORM 时在查询中使用提示并不完全干净,但如果它是唯一的选择是可行的。

谢谢!

开发 Mariadb 版本 10.4.13 和生产版本是 10.4.12(在 docker btw 中运行)。

编辑:

第一个索引正在其他地方使用,它需要在那里(索引 on some_other_id)。也许我可以将两个索引合并到on中?IDK还没有。

EDIT2 为什么我选择有两个索引:

由于some_other_id的基数是 ~70k 并且created_at是 ~400k 我选择有第二个索引首先过滤created_at。现在我在想我这样想是否正确。

index mariadb
  • 1 个回答
  • 775 Views
Martin Hope
vfsoraki
Asked: 2014-09-01 09:21:41 +0800 CST

MongoDB性能问题

  • 2

我有一个 MongoDB 用于存储这样的结果

{_id, type, imei, lat, lng, spd, dir, time}
{_id, type, imei, lac, cid, time}

如果type是f第一个则使用,如果是l第二个则使用。

这是索引:

"indexSizes" : {
    "_id_" : 340358704,
    "imei_1" : 614508160,
    "type_1" : 183616608,
    "type_1_imei_1" : 349793808
},

Collection 有大约 1000 万份文件。我有很多关于typeandimei的查询,目前只有类型f在应用程序中使用。

这是日志文件中的一行

Sun Aug 31 19:14:39.402 [conn782250] query xxyyxx.locs query: { $query: { $and: [ { imei: "359710042581612" }, { type: "f" } ] }, $orderby: { time: -1 } } ntoreturn:1 ntoskip:0 nscanned:140455 scanAndOrder:1 keyUpdates:0 numYields: 59 locks(micros) r:38456361 nreturned:1 reslen:159 19727ms

这花了大约20秒,太多了。

我需要进一步优化我的收藏。这在 Web 应用程序中使用,有时像这样的查询会执行 10imei秒,大约需要 200 秒,这可能会导致超时。这是异步执行的(ajax),但仍然有太多的等待时间。

这里的专家的任何帮助都非常受欢迎。

另外,如果您认为我遗漏了什么,请务必索取更多信息。

提前致谢

顺便说一句,我将 PHP 用于 Web 部件(Laravel 框架和https://github.com/jenssegers/Laravel-MongoDB)

编辑:这是explain(已删除)

EDIT2:创建更好的索引后:

MongoDB shell version: 2.4.9
connecting to: test
> use gpstracker
switched to db gpstracker
> db.locs.stats()
{
    "ns" : "gpstracker.locs",
    "count" : 10137188,
    "size" : 1400944384,
    "avgObjSize" : 138.19852053646434,
    "storageSize" : 1580060672,
    "numExtents" : 19,
    "nindexes" : 2,
    "lastExtentSize" : 415145984,
    "paddingFactor" : 1,
    "systemFlags" : 0,
    "userFlags" : 0,
    "totalIndexSize" : 826806176,
    "indexSizes" : {
        "_id_" : 359997456,
        "type_1_imei_1_time_-1" : 466808720
    },
    "ok" : 1
}
> db.locs.find({ $and: [ { imei: "359710042581612" }, { type: "f" } ] }).explain()
{
    "cursor" : "BtreeCursor type_1_imei_1_time_-1",
    "isMultiKey" : false,
    "n" : 150158,
    "nscannedObjects" : 150158,
    "nscanned" : 150158,
    "nscannedObjectsAllPlans" : 150158,
    "nscannedAllPlans" : 150158,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 329,
    "nChunkSkips" : 0,
    "millis" : 128173,
    "indexBounds" : {
        "type" : [
            [
                "f",
                "f"
            ]
        ],
        "imei" : [
            [
                "359710042581612",
                "359710042581612"
            ]
        ],
        "time" : [
            [
                {
                    "$maxElement" : 1
                },
                {
                    "$minElement" : 1
                }
            ]
        ]
    },
    "server" : "CDSX001:27017"
}
performance optimization
  • 1 个回答
  • 1994 Views
Martin Hope
vfsoraki
Asked: 2014-04-28 06:28:33 +0800 CST

MongoDB 中的这些文件是什么?

  • 3

我正在查看我的服务器,我发现了这个:

[root@host ~]# cd /var/lib/mongo/journal/
[root@host journal]# ls -lh
total 3.1G
-rw-------. 1 mongod mongod 1.0G Apr  7 01:18 j._0
-rw-------. 1 mongod mongod   88 Apr  7 01:18 lsn
-rw-------. 1 mongod mongod 1.0G Dec 19 23:03 prealloc.1
-rw-------. 1 mongod mongod 1.0G Dec 19 23:06 prealloc.2

但在我的数据库中, db.stats() 显示:

> db.stats()
{
    "db" : "gpstracker",
    "collections" : 5,
    "objects" : 59127,
    "avgObjSize" : 139.84318500854093,
    "dataSize" : 8268508,
    "storageSize" : 11198464,
    "numExtents" : 10,
    "indexes" : 3,
    "indexSize" : 1937712,
    "fileSize" : 201326592,
    "nsSizeMB" : 16,
    "dataFileVersion" : {
        "major" : 4,
        "minor" : 5
    },
    "ok" : 1
}

我只有一个数据库,里面有 3 个集合。

也许这是我还不知道的事情。

我搜索了一下,发现了一些关于compact数据库的东西,这对这个有帮助吗?或者这些文件是完全正常的,它们应该是这样的?

如果我的数据库增长了,比如说从~200MB(现在)到~1G。这些文件增长了多少?可以以某种方式优化这些文件(期刊)吗?

对不起,如果我的问题看起来很明显。我是数据库部门的初学者。

提前致谢

mongodb database-tuning
  • 1 个回答
  • 1856 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve