首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在高负载时检索mysql数据的正确方法

问在高负载时检索mysql数据的正确方法
EN

Stack Overflow用户
提问于 2012-10-02 02:04:42
回答 3查看 1.7K关注 0票数 0

我已经建立了一个系统使用PHP-MySQL。这个系统承受着非常沉重的负载,每分钟都有数千次选择、更新、插入和删除。

我想优化这个系统,使它更快,并减少服务器上的负载。我已经引入了memcache,但仍然需要mysql数据。

所以我的问题是,在这种情况下,哪种方法是最好的。目前,我的查询如下所示:

代码语言:javascript
复制
$q = mysql_query($sql);
while(mysql_fetch_array($q)) {...

我读到过使用mysql_fetch_assoc (?)

但也许有一种截然不同的方法,当我开始优化这个系统时?

谢谢大家--(很抱歉我的英语水平有限)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-02 02:12:54

与mysql_fetch_array相比,mysql_fetch_assoc将复制更少的数据,从而使用更少的内存。由于数据是通过数组中的index关联呈现的,因此您将获得一些微小的优化,但如果您的数据集很大,这将有所帮助。

  • 尝试使用natural排序(也就是避免查询语句中的排序),如果可以插入您的结果集,请使用LIMIT
  • 批查询:相反,在同一个表上运行100次插入,尝试做一些小的插入。
  • 缓存如果可以:使用redis或HTTP头生成可以被视为静态的页面尝试使用HTTP头,以避免浏览器始终请求您的站点

<代码>H114等。<代码>H215<代码>F216

票数 1
EN

Stack Overflow用户

发布于 2012-10-02 03:47:25

我建议您使用mysql关键字LIMIT来限制结果集。

将分页添加到mysql返回结果集中将使您的应用程序更轻便,ui加载速度将更快,因为需要获取的行数更少,并且mysql服务器将只在需要时接收select查询。基本上,这就是如何使用limit的语法。

从人员限制X,Y中选择*

其中X是要检索的总行计数,Y是偏移量。

示例:

代码语言:javascript
复制
SELECT * FROM Person LIMIT 10, 0

此查询将返回表Person的前十行,并且:

代码语言:javascript
复制
SELECT * FROM Person LIMIT 10, 10

将显示接下来的10

票数 1
EN

Stack Overflow用户

发布于 2020-05-14 22:19:04

我在PHP语言中对从MySQL中获取信息的各种方法进行了一些计时测试。其目标是找到将一列数据转换为简单数组的最快方法。我已经在enSEMBL数据库上对它进行了测试,这个数据库非常大。

下面的代码是方法1到8的通用代码(9个使用GROUP_CONCAT,10个使用PDO):

代码语言:javascript
复制
$query = "SELECT DISTINCT `name` FROM species LIMIT 5000";
$result = $mysqli->query($query);
*Method code*
print_r(array_filter($species));

方法1:教科书方法

代码语言:javascript
复制
while ($row = $result->fetch_row()) {
         $species[] = $row[0];
      }

方法2: while和reset (注意有些IDE在这里检测到错误)

代码语言:javascript
复制
while ($species[] = reset($result->fetch_row())) ;

方法3: foreach和reset

代码语言:javascript
复制
foreach ($result->fetch_all() as $value) $species[] = reset($value);

方法4: while、foreach和reset

代码语言:javascript
复制
while ($species[] = $result->fetch_row()) ;
foreach ($species as $key => $value) $species[$key] = reset($value);

方法5: while and index

代码语言:javascript
复制
while ($row = $result->fetch_row()) $species[] = $row[0];

方法6: foreach和index

代码语言:javascript
复制
foreach ($result->fetch_all() as $value) $species[] = $value[0];

方法7:递归数组

代码语言:javascript
复制
$species = call_user_func_array('array_merge', $result->fetch_all());

方法8: array_column

代码语言:javascript
复制
$species = array_column($result->fetch_all(), 0);

方法9:在查询中使用GROUP_CONCAT。

代码语言:javascript
复制
$species = explode(',', $result->fetch_row()[0]);

方法10: PDO

代码语言:javascript
复制
$species = $sth->fetchAll(PDO::FETCH_COLUMN, 0);

令人惊讶的是,方法1(教科书)始终比实际相同的方法5长约4倍,但所用时间与方法10 (PDO)大致相同。

方法2一直是最慢的方法,长50倍,大概是因为系统在某个地方写了警告。

方法4(两个循环)是第二慢的,花费了10倍的时间。

如上所述,方法1(教科书)和10 (PDO)排在第三位。

方法9是第四慢的(长2倍,缺点是在没有任何警告的情况下达到GROUP_CONCAT限制)。

然而,最快的方法并不一致。从3,5,6,7和8中选择。

方法8 (array_column)通常是完成此任务的最快方法,但并非总是如此。然而,我认为它是最优雅的方法,并且提供了稍微高一点的灵活性,因为它可以使用查询选择的任意两列返回一个关联数组(但不要打乱查询中的顺序!)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12678559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档