国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

WordPress網(wǎng)站10W+數(shù)據(jù),數(shù)據(jù)庫查詢優(yōu)化。

ideaa / 1065人閱讀

摘要:網(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ù)量也查詢出來,

使用這種方式的有: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ù)量小的時候,不會引起什么問題,

但是當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’ ) ) {
/**
* 設置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 方式重構
*/
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方法可以返回表內精確的行數(shù),每執(zhí)行一次都會進行一次全表掃描,

以避免由于其他連接進行delete和insert引起結果不精確。

在某些索引下是好事,但是如果表中有主鍵,count(*)的速度就會很慢,特別在千萬記錄以上的大表。

如果用 explain 命令速度會快很多,因為 explain 用并不真正執(zhí)行查詢,而是查詢優(yōu)化器【估算】的行數(shù)。

在一個1500萬條記錄的表中測試,用select count(*)耗時15s,而用explain耗時0.08秒,

兩者相差差不多有200倍之多(第一次執(zhí)行會稍慢,3秒左右)。

如下是explain方式:

> 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’]就可以拿到這個預估值。

select count(*)則會在extra中有一行Select tables optimized away,不會拿到函數(shù)估算值。

?

所以,在對數(shù)據(jù)準確性要求不高,但是對速度要求很苛刻的場合,絕對有必要用這個估算值代替。

你也可以用下面這句,結果和explain一模一樣:

select TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES where TABLE_NAME=‘posts’;
+————+
| TABLE_ROWS |
+————+
| 12596096 |
+————+
1 row in set (0.04 sec)

根據(jù)實際情況任選一個,都是同一個東西。

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/118203.html

相關文章

  • WordPress網(wǎng)站10W+數(shù)據(jù),mysql數(shù)據(jù)查詢優(yōu)化

    摘要:網(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....

    番茄西紅柿 評論0 收藏2637
  • wordpress數(shù)據(jù)優(yōu)化wordpress自帶mysql數(shù)據(jù)庫修復優(yōu)化工具

    wordpress數(shù)據(jù)庫優(yōu)化和修復一般方法還是比較多的,有的用戶可能會安裝wordpress數(shù)據(jù)庫優(yōu)化插件,比如:wp-optimize、wp_clean_up、WP-Sweep等優(yōu)化插件。其實,我們也可以不用插件就能優(yōu)化wordpress的mysql數(shù)據(jù)庫,比如使用官方推薦的工具,那么如何打開使用這個工具呢?官方自帶的數(shù)據(jù)庫修復和優(yōu)化工具,也是首先針對MySQL。(MariaDB上也可以跑WP)...

    番茄西紅柿 評論0 收藏2637
  • wordpress數(shù)據(jù)優(yōu)化:如何清理優(yōu)化wp_postmeta數(shù)據(jù)

    摘要:數(shù)據(jù)庫怎么優(yōu)化數(shù)據(jù)表是搭建程序中用來存儲文件附帶信息的,一般沒什么特別的情況,這些信息都是沒有什么作用的,下面分享一下優(yōu)化優(yōu)化教程,讓你的數(shù)據(jù)表變得更干凈,減少網(wǎng)站數(shù)據(jù)庫的負擔。請各位站長操作之前請先備份網(wǎng)站數(shù)據(jù)庫。wordpress數(shù)據(jù)庫怎么優(yōu)化?wp_postmeta數(shù)據(jù)表是wordpress搭建程序中用來存儲文件附帶信息的,一般沒什么特別的情況,這些信息都是沒有什么作用的,下面分享一下...

    番茄西紅柿 評論0 收藏2637
  • PHP 性能分析第三篇: 性能調優(yōu)實戰(zhàn)

    摘要:注意本文是我們的性能分析系列的第三篇,點此閱讀性能分析第一篇介紹,或性能分析第二篇深入研究。小的性能提升很可能來自優(yōu)化,而非緩存。注意此更改已提交到并已獲更新。目前,兩者具備相同的特性,只有一些部分重命名了。 注意:本文是我們的 PHP 性能分析系列的第三篇,點此閱讀?PHP 性能分析第一篇: XHProf & XHGui 介紹?,或??PHP 性能分析第二篇: 深入研究 XHGui...

    cnsworder 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<