摘要:網(wǎng)站網(wǎng)站數(shù)據(jù),數(shù)據(jù)庫(kù)查詢優(yōu)化數(shù)據(jù)庫(kù)查詢優(yōu)化。如果用命令速度會(huì)快很多,因?yàn)橛貌⒉徽嬲龍?zhí)行查詢,而是查詢優(yōu)化器估算的行數(shù)。則會(huì)在中有一行,不會(huì)拿到函數(shù)估算值。
WordPress網(wǎng)站10W+數(shù)據(jù),mysql數(shù)據(jù)庫(kù)查詢優(yōu)化。WordPress在查詢post列表時(shí),默認(rèn)會(huì)同時(shí)把文章數(shù)量也查詢出來(lái),使用這種方式的有:get_posts 、query_posts和WP_Query。get_posts在4.6.1+已經(jīng)不用SQL_CALC_FOUND_ROWS,但是query_posts和WP_Query還是會(huì)用,所以還須優(yōu)化。
具體語(yǔ)句如下:
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = ‘post’ AND (wp_posts.post_status = ‘publish’ ) ORDER BY wp_posts.post_date DESC LIMIT 0, 20
SELECT FOUND_ROWS()
這在網(wǎng)站數(shù)據(jù)量小的時(shí)候,不會(huì)引起什么問(wèn)題,
但是當(dāng)post數(shù)量到10w+的時(shí)候,這個(gè)就是一條必現(xiàn)的慢查詢,
首頁(yè)、分類、標(biāo)簽、搜索頁(yè)面,只要用到這幾個(gè)函數(shù),就都會(huì)使用SQL_CALC_FOUND_ROWS這個(gè)方式。
如何解決?
方法一:
徹底禁用SQL_CALC_FOUND_ROWS
放在functions.php文件即可:
add_action(‘pre_get_posts’, ‘wndt_post_filter’);
function wndt_post_filter($query) {
if (is_admin() or !$query->is_main_query()) {
return $query;
}
// 禁止查詢 SQL_CALC_FOUND_ROWS
$query->set(‘no_found_rows’, true);
}
方法二:
如果仍然需要查詢文章數(shù)量,使用更加高效的EXPLAIN方式代替SQL_CALC_FOUND_ROWS
禁用掉SQL_CALC_FOUND_ROWS用法,用一種更加高效的方式,
這里我們用EXPLAIN方式
具體代碼如下,放在functions.php文件即可:
if ( ! function_exists( ‘maizi_set_no_found_rows’ ) ) {
/**
* 設(shè)置WP_Query的 ‘no_found_rows’ 屬性為true,禁用SQL_CALC_FOUND_ROWS
*
* @param WP_Query $wp_query WP_Query實(shí)例
* @return void
*/
function maizi_set_no_found_rows(/WP_Query $wp_query)
{
$wp_query->set(‘no_found_rows’, true);
}
}
add_filter( ‘pre_get_posts’, ‘maizi_set_no_found_rows’, 10, 1 );
if ( ! function_exists( ‘maizi_set_found_posts’ ) ) {
/**
* 使用 EXPLAIN 方式重構(gòu)
*/
function maizi_set_found_posts($clauses, /WP_Query $wp_query)
{
// Don’t proceed if it’s a singular page.
if ($wp_query->is_singular()) {
return $clauses;
}
global $wpdb;
$where = isset($clauses[‘where’]) ? $clauses[‘where’] : ”;
$join = isset($clauses[‘join’]) ? $clauses[‘join’] : ”;
$distinct = isset($clauses[‘distinct’]) ? $clauses[‘distinct’] : ”;
$wp_query->found_posts = (int)$wpdb->get_row(“EXPLAIN SELECT $distinct * FROM {$wpdb->posts} $join WHERE 1=1 $where”)–>rows;
$posts_per_page = (!empty($wp_query->query_vars[‘posts_per_page’]) ? absint($wp_query->query_vars[‘posts_per_page’]) : absint(get_option(‘posts_per_page’)));
$wp_query->max_num_pages = ceil($wp_query->found_posts / $posts_per_page);
return $clauses;
}
}
add_filter( ‘posts_clauses’, ‘maizi_set_found_posts’, 10, 2 );
為什么用EXPLAIN而不是count(*)?
select count(*)是MySQL中用于統(tǒng)計(jì)記錄行數(shù)最常用的方法。
count方法可以返回表內(nèi)精確的行數(shù),每執(zhí)行一次都會(huì)進(jìn)行一次全表掃描,
以避免由于其他連接進(jìn)行delete和insert引起結(jié)果不精確。
在某些索引下是好事,但是如果表中有主鍵,count(*)的速度就會(huì)很慢,特別在千萬(wàn)記錄以上的大表。
如果用 explain 命令速度會(huì)快很多,因?yàn)?explain 用并不真正執(zhí)行查詢,而是查詢優(yōu)化器【估算】的行數(shù)。
在一個(gè)1500萬(wàn)條記錄的表中測(cè)試,用select count(*)耗時(shí)15s,而用explain耗時(shí)0.08秒,
兩者相差差不多有200倍之多(第一次執(zhí)行會(huì)稍慢,3秒左右)。
如下是explain方式:
mysql> explain select * from posts;
+—-+————-+————-+————+——+—————+——+———+——+———-+———-+——-+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+—-+————-+————-+————+——+—————+——+———+——+———-+———-+——-+
| 1 | SIMPLE | posts | NULL | ALL | NULL | NULL | NULL | NULL | 12596096 | 100.00 | NULL |
+—-+————-+————-+————+——+—————+——+———+——+———-+———-+——-+
1 row in set, 1 warning (0.08 sec)
注意,這里用的是select *,不是select count(*)。
select *會(huì)返回一行數(shù)據(jù),包括估算行數(shù)rows,在PHP中我們fetch(),再通過(guò)$result[‘rows’]就可以拿到這個(gè)預(yù)估值。
select count(*)則會(huì)在extra中有一行Select tables optimized away,不會(huì)拿到函數(shù)估算值。
所以,在對(duì)數(shù)據(jù)準(zhǔn)確性要求不高,但是對(duì)速度要求很苛刻的場(chǎng)合,絕對(duì)有必要用這個(gè)估算值代替。
你也可以用下面這句,結(jié)果和explain一模一樣:
select TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES where TABLE_NAME=‘posts’;
+————+
| TABLE_ROWS |
+————+
| 12596096 |
+————+
1 row in set (0.04 sec)
根據(jù)實(shí)際情況任選一個(gè),都是同一個(gè)東西。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/118229.html
wordpress數(shù)據(jù)庫(kù)優(yōu)化和修復(fù)一般方法還是比較多的,有的用戶可能會(huì)安裝wordpress數(shù)據(jù)庫(kù)優(yōu)化插件,比如:wp-optimize、wp_clean_up、WP-Sweep等優(yōu)化插件。其實(shí),我們也可以不用插件就能優(yōu)化wordpress的mysql數(shù)據(jù)庫(kù),比如使用官方推薦的工具,那么如何打開(kāi)使用這個(gè)工具呢?官方自帶的數(shù)據(jù)庫(kù)修復(fù)和優(yōu)化工具,也是首先針對(duì)MySQL。(MariaDB上也可以跑WP)...
摘要:數(shù)據(jù)庫(kù)怎么優(yōu)化數(shù)據(jù)表是搭建程序中用來(lái)存儲(chǔ)文件附帶信息的,一般沒(méi)什么特別的情況,這些信息都是沒(méi)有什么作用的,下面分享一下優(yōu)化優(yōu)化教程,讓你的數(shù)據(jù)表變得更干凈,減少網(wǎng)站數(shù)據(jù)庫(kù)的負(fù)擔(dān)。請(qǐng)各位站長(zhǎng)操作之前請(qǐng)先備份網(wǎng)站數(shù)據(jù)庫(kù)。wordpress數(shù)據(jù)庫(kù)怎么優(yōu)化?wp_postmeta數(shù)據(jù)表是wordpress搭建程序中用來(lái)存儲(chǔ)文件附帶信息的,一般沒(méi)什么特別的情況,這些信息都是沒(méi)有什么作用的,下面分享一下...
摘要:網(wǎng)站數(shù)據(jù),數(shù)據(jù)庫(kù)查詢優(yōu)化。如果用命令速度會(huì)快很多,因?yàn)橛貌⒉徽嬲龍?zhí)行查詢,而是查詢優(yōu)化器估算的行數(shù)。則會(huì)在中有一行,不會(huì)拿到函數(shù)估算值。所以,在對(duì)數(shù)據(jù)準(zhǔn)確性要求不高,但是對(duì)速度要求很苛刻的場(chǎng)合,絕對(duì)有必要用這個(gè)估算值代替。 WordPress網(wǎng)站10W+數(shù)據(jù),數(shù)據(jù)庫(kù)查詢優(yōu)化。 WordPress在查詢post列表時(shí),默認(rèn)會(huì)同時(shí)把文章數(shù)量也查詢出來(lái),...
摘要:注意本文是我們的性能分析系列的第三篇,點(diǎn)此閱讀性能分析第一篇介紹,或性能分析第二篇深入研究。小的性能提升很可能來(lái)自優(yōu)化,而非緩存。注意此更改已提交到并已獲更新。目前,兩者具備相同的特性,只有一些部分重命名了。 注意:本文是我們的 PHP 性能分析系列的第三篇,點(diǎn)此閱讀?PHP 性能分析第一篇: XHProf & XHGui 介紹?,或??PHP 性能分析第二篇: 深入研究 XHGui...
閱讀 740·2023-04-25 19:43
閱讀 3986·2021-11-30 14:52
閱讀 3816·2021-11-30 14:52
閱讀 3873·2021-11-29 11:00
閱讀 3808·2021-11-29 11:00
閱讀 3907·2021-11-29 11:00
閱讀 3584·2021-11-29 11:00
閱讀 6197·2021-11-29 11:00