MySQL 查询中的性能

Posted

技术标签:

【中文标题】MySQL 查询中的性能【英文标题】:Performance in MySQL query 【发布时间】:2014-06-22 11:02:09 【问题描述】:

我正在 php/mysql 中构建一个简单的投票、唯一查看器、唯一下载计数等功能,我有一个关于性能的问题:

由于对这个小型系统采取了许多行动,我想知道这方面的最佳实践是什么,使用多个 INT 列或 1 个单一 VARCHAR 列,当然在性能方面:

$uniqueid= STRING generated from system (ip, cookies Etc)
$contentid = INT ID on primary key of content table
$contenttype = INT 0-n   ( comment = 0, poll = 1, filedownload = 2 Etc).
$action = INT 0-n ( vote = 0,  view = 1, download = 2 Etc)


SELECT *
FROM `table`
WHERE `uid` = '$uniqueid' AND `cid` = '$contentid' AND `ct` = '$contenttype' AND `action` = '$action' ;

或者这个:

$key  = "$uniqueid-$contentid-$contenttype-$action";

SELECT *
FROM `table`
WHERE `key` = '$key';

【问题讨论】:

这似乎是过早优化的一个例子。没有理由不对具有多种类型的四种不同属性使用四列。您应该采用该解决方案,除非您有非常具体且晦涩难懂的性能要求。 正如 Gordon 所说,没有必要让事情复杂化。 MySQL 应该能够轻松地查找 1M+ 行/秒。最好的优化不是优化,在你意识到需要优化之前不要担心。无论如何,像第二种情况那样存储数据将是以后的噩梦。 刚刚添加了一个答案,但总的来说,从结构的角度来看,第一个示例最有意义。代码上线后,任何性能调整都可能发生在 MySQL 服务器上。事实上,真正微调服务器的唯一方法是在实时环境中处理真实流量。这意味着计划在初始发布期间进行调整和调整。 您好,感谢您的快速回复。是的,这是一个典型的过早优化,我知道 :) 我在选择术语时也有错,对于这个不完整的例子来说,性能是一个雄心勃勃的词。在开发过程中,性能包括以最有效方式发挥作用的大量流程和组件。正确的术语是速度,只是查询索引 VARCHAR 与 INT 的速度差异。无论如何,由于我的“小”项目发生了一些变化,更合理的解决方案是使用多个 INT 列。在未来的功能上更可重用,我在 mysql 集群上不再有这个“问题”了。 【参考方案1】:

你应该把它们分开。

您可能希望稍后删除其中一项功能 可以从每个单独提取使用数据 除非你总是需要这三个,否则它会更慢

【讨论】:

【参考方案2】:

评论有点长。

这是您的查询:

SELECT *
FROM `table`
WHERE `uid` = '$uniqueid' AND `cid` = '$contentid' AND `ct` = '$contenttype' AND `action` = '$action' ;

如果您希望这样的查询快速运行,您希望使用复合索引:

create index table_uid_cid_ct_action on table(uid, cid, ct, action)

该索引将加快对这四列的任何查询,其中条件都是=

【讨论】:

【参考方案3】:

由于对这个小系统进行了许多操作,我想知道什么是 最佳实践,使用多个 INT 列或 1 个单个 VARCHAR 列,当然是在性能方面。

老实说,这有点像在大学里,心理学专业的学生阅读症状并开始诊断他们所有的朋友……甚至是他们自己! MySQL 优化是需要牢记的。但还不止。只需按照您认为应该工作的方式进行编程。如果性能仅成为 & 问题,则进行优化。

也就是说,我认为从 MySQL 结构的角度来看,您使用 INT 列的第一个示例更有意义。关键是创建适当的 MySQL 索引,一旦你的代码库有点稳固以加快速度,你就可以在事后执行这些索引。然后,您可以决定存储引擎(如 MyISAM 或 InnoDB)是否最合适。

但这都是事后的考虑。除此之外,我建议您在投入生产后使用MySQL Tuning Primer Script located here 对您的 MySQL 服务器进行微调。

是的,我说的是生产。您可以尝试在开发服务器上调整 MySQL 服务器,但它最终不会承担实时服务器的流量。因此,请准备好在 MySQL 上线的第一周(一个月?)照看它并编写代码。

此外,根据您的最终设置,您可能需要学习如何手动调整性能——这意味着您要学会自己解释 MySQL 输出并对其采取行动——但这个脚本适用于我曾经做过的 95% 的设置使用它们。另外 5% 是需要更多定制服务的数据库特殊设置。我强烈推荐像this one on the MySQL performance blog 这样的教程。

【讨论】:

以上是关于MySQL 查询中的性能的主要内容,如果未能解决你的问题,请参考以下文章

mysql 关联查询是不是很耗性能

如何强制连接顺序以提高 MYSQL 中的查询性能?

MySQL SELECT 查询中的性能问题?

mysql性能中的PDO

如何提高 Django 管理员搜索相关字段(MySQL)中的查询性能

MySQL InnoDB 与 MyISAM 中的复杂查询性能