我已经建立了一个系统使用PHP-MySQL。这个系统承受着非常沉重的负载,每分钟都有数千次选择、更新、插入和删除。
我想优化这个系统,使它更快,并减少服务器上的负载。我已经引入了memcache,但仍然需要mysql数据。
所以我的问题是,在这种情况下,哪种方法是最好的。目前,我的查询如下所示:
$q = mysql_query($sql);
while(mysql_fetch_array($q)) {...我读到过使用mysql_fetch_assoc (?)
但也许有一种截然不同的方法,当我开始优化这个系统时?
谢谢大家--(很抱歉我的英语水平有限)
发布于 2012-10-02 02:12:54
与mysql_fetch_array相比,mysql_fetch_assoc将复制更少的数据,从而使用更少的内存。由于数据是通过数组中的index关联呈现的,因此您将获得一些微小的优化,但如果您的数据集很大,这将有所帮助。
natural排序(也就是避免查询语句中的排序),如果可以插入您的结果集,请使用LIMIT <代码>H114等。<代码>H215<代码>F216
发布于 2012-10-02 03:47:25
我建议您使用mysql关键字LIMIT来限制结果集。
将分页添加到mysql返回结果集中将使您的应用程序更轻便,ui加载速度将更快,因为需要获取的行数更少,并且mysql服务器将只在需要时接收select查询。基本上,这就是如何使用limit的语法。
从人员限制X,Y中选择*
其中X是要检索的总行计数,Y是偏移量。
示例:
SELECT * FROM Person LIMIT 10, 0此查询将返回表Person的前十行,并且:
SELECT * FROM Person LIMIT 10, 10将显示接下来的10
发布于 2020-05-14 22:19:04
我在PHP语言中对从MySQL中获取信息的各种方法进行了一些计时测试。其目标是找到将一列数据转换为简单数组的最快方法。我已经在enSEMBL数据库上对它进行了测试,这个数据库非常大。
下面的代码是方法1到8的通用代码(9个使用GROUP_CONCAT,10个使用PDO):
$query = "SELECT DISTINCT `name` FROM species LIMIT 5000";
$result = $mysqli->query($query);
*Method code*
print_r(array_filter($species));方法1:教科书方法
while ($row = $result->fetch_row()) {
$species[] = $row[0];
}方法2: while和reset (注意有些IDE在这里检测到错误)
while ($species[] = reset($result->fetch_row())) ;方法3: foreach和reset
foreach ($result->fetch_all() as $value) $species[] = reset($value);方法4: while、foreach和reset
while ($species[] = $result->fetch_row()) ;
foreach ($species as $key => $value) $species[$key] = reset($value);方法5: while and index
while ($row = $result->fetch_row()) $species[] = $row[0];方法6: foreach和index
foreach ($result->fetch_all() as $value) $species[] = $value[0];方法7:递归数组
$species = call_user_func_array('array_merge', $result->fetch_all());方法8: array_column
$species = array_column($result->fetch_all(), 0);方法9:在查询中使用GROUP_CONCAT。
$species = explode(',', $result->fetch_row()[0]);方法10: PDO
$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)通常是完成此任务的最快方法,但并非总是如此。然而,我认为它是最优雅的方法,并且提供了稍微高一点的灵活性,因为它可以使用查询选择的任意两列返回一个关联数组(但不要打乱查询中的顺序!)
https://stackoverflow.com/questions/12678559
复制相似问题