摘要:網(wǎng)站網(wǎng)站數(shù)據(jù),數(shù)據(jù)庫查詢優(yōu)化數(shù)據(jù)庫查詢優(yōu)化。如果用命令速度會快很多,因為用并不真正執(zhí)行查詢,而是查詢優(yōu)化器估算的行數(shù)。則會在中有一行,不會拿到函數(shù)估算值。
WordPress網(wǎng)站10W+數(shù)據(jù),mysql數(shù)據(jù)庫查詢優(yōu)化。WordPress在查詢post列表時,默認會同時把文章數(shù)量也查詢出來,使用這種方式的有:get_posts 、query_posts和WP_Query。get_posts在4.6.1+已經(jīng)不用SQL_CALC_FOUND_ROWS,但是query_posts和WP_Query還是會用,所以還須優(yōu)化。
具體語句如下:
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ù)量小的時候,不會引起什么問題,
但是當(dāng)post數(shù)量到10w+的時候,這個就是一條必現(xiàn)的慢查詢,
首頁、分類、標簽、搜索頁面,只要用到這幾個函數(shù),就都會使用SQL_CALC_FOUND_ROWS這個方式。
如何解決?
方法一:
徹底禁用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實例
* @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)計記錄行數(shù)最常用的方法。
count方法可以返回表內(nèi)精確的行數(shù),每執(zhí)行一次都會進行一次全表掃描,
以避免由于其他連接進行delete和insert引起結(jié)果不精確。
在某些索引下是好事,但是如果表中有主鍵,count(*)的速度就會很慢,特別在千萬記錄以上的大表。
如果用 explain 命令速度會快很多,因為 explain 用并不真正執(zhí)行查詢,而是查詢優(yōu)化器【估算】的行數(shù)。
在一個1500萬條記錄的表中測試,用select count(*)耗時15s,而用explain耗時0.08秒,
兩者相差差不多有200倍之多(第一次執(zhí)行會稍慢,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 *會返回一行數(shù)據(jù),包括估算行數(shù)rows,在PHP中我們fetch(),再通過$result[‘rows’]就可以拿到這個預(yù)估值。
select count(*)則會在extra中有一行Select tables optimized away,不會拿到函數(shù)估算值。
所以,在對數(shù)據(jù)準確性要求不高,但是對速度要求很苛刻的場合,絕對有必要用這個估算值代替。
你也可以用下面這句,結(jié)果和explain一模一樣:
select TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES where TABLE_NAME=‘posts’;
+————+
| TABLE_ROWS |
+————+
| 12596096 |
+————+
1 row in set (0.04 sec)
根據(jù)實際情況任選一個,都是同一個東西。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/118229.html
wordpress數(shù)據(jù)庫優(yōu)化和修復(fù)一般方法還是比較多的,有的用戶可能會安裝wordpress數(shù)據(jù)庫優(yōu)化插件,比如:wp-optimize、wp_clean_up、WP-Sweep等優(yōu)化插件。其實,我們也可以不用插件就能優(yōu)化wordpress的mysql數(shù)據(jù)庫,比如使用官方推薦的工具,那么如何打開使用這個工具呢?官方自帶的數(shù)據(jù)庫修復(fù)和優(yōu)化工具,也是首先針對MySQL。(MariaDB上也可以跑WP)...
摘要:數(shù)據(jù)庫怎么優(yōu)化數(shù)據(jù)表是搭建程序中用來存儲文件附帶信息的,一般沒什么特別的情況,這些信息都是沒有什么作用的,下面分享一下優(yōu)化優(yōu)化教程,讓你的數(shù)據(jù)表變得更干凈,減少網(wǎng)站數(shù)據(jù)庫的負擔(dān)。請各位站長操作之前請先備份網(wǎng)站數(shù)據(jù)庫。wordpress數(shù)據(jù)庫怎么優(yōu)化?wp_postmeta數(shù)據(jù)表是wordpress搭建程序中用來存儲文件附帶信息的,一般沒什么特別的情況,這些信息都是沒有什么作用的,下面分享一下...
摘要:網(wǎng)站數(shù)據(jù),數(shù)據(jù)庫查詢優(yōu)化。如果用命令速度會快很多,因為用并不真正執(zhí)行查詢,而是查詢優(yōu)化器估算的行數(shù)。則會在中有一行,不會拿到函數(shù)估算值。所以,在對數(shù)據(jù)準確性要求不高,但是對速度要求很苛刻的場合,絕對有必要用這個估算值代替。 WordPress網(wǎng)站10W+數(shù)據(jù),數(shù)據(jù)庫查詢優(yōu)化。 WordPress在查詢post列表時,默認會同時把文章數(shù)量也查詢出來,...
摘要:注意本文是我們的性能分析系列的第三篇,點此閱讀性能分析第一篇介紹,或性能分析第二篇深入研究。小的性能提升很可能來自優(yōu)化,而非緩存。注意此更改已提交到并已獲更新。目前,兩者具備相同的特性,只有一些部分重命名了。 注意:本文是我們的 PHP 性能分析系列的第三篇,點此閱讀?PHP 性能分析第一篇: XHProf & XHGui 介紹?,或??PHP 性能分析第二篇: 深入研究 XHGui...
閱讀 713·2023-04-25 19:43
閱讀 3907·2021-11-30 14:52
閱讀 3784·2021-11-30 14:52
閱讀 3852·2021-11-29 11:00
閱讀 3783·2021-11-29 11:00
閱讀 3869·2021-11-29 11:00
閱讀 3557·2021-11-29 11:00
閱讀 6104·2021-11-29 11:00