问题标签 [database-optimization]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
142 浏览

mysql - 在主键 + 外键上创建多个索引是否有性能优势?

如果我有一个具有主键和外键的表,并且经常使用包含两者的查询来完成搜索(...WHERE primary=n AND foreign=x),那么使用这两个键在 MySQL 中创建多个索引是否有任何性能优势?

我知道它们已经是两个索引,但是我不确定当包含在另一个表中时外键是否仍被视为索引。例如,MySQL会去主键,然后比较外键的所有值,直到找到正确的值,还是因为外键也是索引而已经知道它在哪里?

更新:我正在使用 InnoDB 表。

0 投票
2 回答
2891 浏览

sql - MS SQL:从巨大表中删除行的最佳方法

我有一个非常大的表 [X],它有 1.7 亿行,我们需要归档数据以仅保留 [X] 中使用的记录。我们这样做是为了让我们的系统在减速时保持快速。我们只使用整个表中的少量行(说不到 10%),因此我们可以将大量数据归档到例如 Archive.[X] 中。

问题是当我们尝试删除记录时,会花费很多时间。现在我们已经运行了以下检查以进行故障排除,以查看为什么需要这么长时间的任何可能性 1) 表已编入索引 2) 没有未索引的外键 3) 删除时没有触发器在后台执行额外工作

大家有没有遇到过类似的情况?做类似事情时最好遵循的程序是什么?有没有可以提供帮助的工具?

我感谢您的帮助!

0 投票
2 回答
316 浏览

mysql - mysql优化脚本文件

我正在考虑让某人对数据库进行一些优化。如果我给他们一个具有不同数据的类似版本的数据库,他们是否可以创建一个脚本文件来在我的数据库上运行所有优化(即创建索引等),而他们却从未看到或接触过实际的数据库?我正在查看 MySQL,但如有必要,将对其他数据库开放。感谢您的任何建议。

编辑:

如果它是具有转换数据的相同副本怎么办?连同几个近似于数据库用途的示例查询(即 OLAP 与 OLTP)?脚本是否能够包含所有内容,或者他们是否需要亲自访问实际数据库?

编辑2:

我可以创建数据库的副本,转换数据以使其无法识别,创建数据库的备份文件,将其提供给供应商,然后他们给我一个脚本文件以在我的数据库上运行吗?

0 投票
1 回答
282 浏览

django - django 数据库查询优化

关于 django db 查询优化的新手问题:

我有一个自定义模型表单来编辑 Destination 对象,并且我在构造函数中获取了来自相关访问者模型的查询集,该模型在 Destination 中有 ManyToMany 字段(有关使用自定义模型表单的原因,请参阅编辑)

这个想法是将相关的visitor_set加载到一个变量中,以避免重复查询以检查每个访问者是否存在于visitor_set中。这是最好的方法吗?

另外,如果我打开数据库日志记录(如本问题中所述,第二个答案),我可以看到一个重复的查询(第三个 SELECT 语句)来选择目标 id 1 的所有访问者,但这在我写的代码中没有,它从何而来?

编辑

Destination我所指的对象是对象ManyToMany上字段的相关侧Visitor。如果我的表单正在编辑访问者对象本身,那么 Django 将ManyToMany自动处理该字段。但是要在模型表单上执行此操作,Destination我需要为它添加一个多项选择字段Visitor并自定义__init__方法来为其加载选择和初始选择。

然而,问题是关于如何处理查询集,以及神秘的第二个 sql 来加载许多值,我也可以从 shell 中看到:

谢谢

0 投票
4 回答
282 浏览

php - 如何使用 php 和 mysql 优化这个简单的数据库和查询?

我从数据库中提取了一系列(例如限制 72、24)游戏,根据这些游戏被评为最受欢迎。我有一个单独的表用于跟踪游戏数据,还有一个用于跟踪游戏的个人投票(评分从 1 到 5,每个游戏每个用户一票)。当该游戏在该游戏的所有评分投票中具有最高平均评分时,该游戏被视为“最受欢迎”或“更受欢迎”。少于 5 票的游戏不予考虑。这是表格的样子(两个表格,“游戏”和“投票”):

现在,我知道有一种叫做“索引”的东西可以通过预先查询我的表并构建一个单独的索引表来加速我的查询(我真的不知道......这只是我的印象)。

我还读到,当多个查询可以压缩为一个更长的查询(我想包含连接和嵌套的选择语句)时,mysql 运行速度最快。

但是,我目前没有使用索引,我正在进行多次查询以获得最终结果。

应该对我的数据库进行哪些更改(如果有的话——包括构建索引表等)?我的查询应该是什么样的?

谢谢你。

0 投票
3 回答
1407 浏览

database-design - Advantages of having user authentication details stored in a separate table

I have a user table in mysql containing all user data (firstname, surname, address, etc)

But should I store the authentication details in another table (username, password) and link the two tables via a user ID?

Is there much point in this?

Is it more secure?

or does it just add extra coding?

0 投票
2 回答
3973 浏览

django - 使用 Django QuerySet 分块处理数据库的最佳方法?

我正在对数据库中的所有行运行批处理操作。这涉及选择每个模型并对其进行处理。将其拆分为块并逐块执行是有意义的。

我目前正在使用 Paginator,因为它很方便。这意味着我需要对这些值进行排序,以便可以按顺序对它们进行分页。这确实会生成具有orderlimit子句的 SQL 语句,并且对于每个块,我认为 Postgres 可能正在对整个表进行排序(尽管我不能声称对内部有任何了解)。我所知道的是数据库的 CPU 大约为 50%,我认为这太高了,不能做selects。

以 RDMBS/CPU 友好的方式迭代整个表的最佳方法是什么?

假设在批处理操作期间数据库的内容没有改变。

0 投票
3 回答
305 浏览

sql - 为了创建高质量的 Django 应用程序,我需要了解哪些数据库知识?

我正在尝试优化我的网站,并找到了这个不错的 Django 小文档: Database Access Optimization,它建议进行分析,然后进行索引,并选择适当的字段作为数据库优化的起点。

通常,django 文档可以很好地解释事情,即使是更有经验的程序员可能认为“显而易见”的事情。在这种情况下并非如此。在没有解释索引之后,文档继续说:

我们将假设您已经完成了上述显而易见的事情。

呃。等待!索引是什么鬼?

显然,我可以通过谷歌弄清楚索引是什么,我的问题是:为了创建一个可扩展的网站,我需要知道什么是数据库内容?关于 Django 框架,我应该特别注意什么?我还应该知道哪些其他“显而易见”的事情?我在哪里可以学习它们?

我希望在这里找到一个方向。我不需要学习任何有关 SQL 的知识,我只想了解足够多的信息来以正确的方式构建我的应用程序。

提前致谢!

0 投票
5 回答
1283 浏览

mysql - 插入新数据库条目是否比先检查条目是否存在更快?

曾经有人告诉我,只运行插入并让插入失败比检查数据库条目是否存在然后插入是否丢失要快。

我还被告知,大多数数据库都针对阅读而不是写作进行了大量优化,所以快速检查不会比慢速插入更快吗?

这是预期碰撞次数的问题吗?(IE 只有在条目已经存在的可能性很小的情况下才插入更快。)它是否取决于我正在运行的数据库类型?就此而言,拥有一种不断将插入错误添加到我的错误日志的方法是不好的做法吗?

谢谢。

0 投票
1 回答
53 浏览

mysql - 可以在“首选用户”MySQL 查询中优化左连接吗?

我有两张桌子:

poll_response (poll_id, option_id, user_id) (大约 500,000 行,有 500 个唯一投票、1000 个唯一选项和 25000 个唯一用户)

preferred_users (user_id) (大约 800 行)

我想确定选择每个选项的用户中有多少是“首选用户”(即具有高声誉的用户)。其他用户可以回复投票;为了识别响应来自首选用户,需要连接到 preferred_users 表。

这是我所拥有的:

查询吐出一个像这样的表:

然后我可以做数学来确定百分比。

问题是查询经常超时——这意味着它需要一分钟多的时间才能完成。

有没有办法摆脱左连接或以其他方式优化查询?