Opened 15 years ago
Closed 15 years ago
#11292 closed enhancement (duplicate)
get_page_by_path() recursively makes unnecessary database calls for a hierarchical structure
Reported by: |
|
Owned by: | |
---|---|---|---|
Milestone: | Priority: | normal | |
Severity: | normal | Version: | 2.8.5 |
Component: | Performance | Keywords: | database, page, performance |
Focuses: | Cc: |
Description
I'm using WordPress as a CMS for around 600 static pages websites.
Please note - All plugins are disabled and using simple html for templates. So no plugin or theme problem.
Website page structure is like this -
/first/second/cancer/
/first/third/cancer/
/first/fourth/cancer/
.........
........
........
/newfirst/cancer/
For such structure, get_page_by_path() recursively checks for page's parent and makes too many unnecessary database calls. More than 35 to be precise. I have checked through php xdebug and WP-Tune plugin and here's a sample query set -
5 13.367 SELECT ID, post_name, post_parent FROM ask_posts WHERE ID = 139 and post_type='page' [wp-includes\post.php(2107): wpdb->get_row()] 7 2.137 SELECT ID, post_name, post_parent FROM ask_posts WHERE ID = 11 and post_type='page' [wp-includes\post.php(2107): wpdb->get_row()] 28 1.509 SELECT ID, post_name, post_parent FROM ask_posts WHERE ID = 442 and post_type='page' [wp-includes\post.php(2107): wpdb->get_row()] 16 1.498 SELECT ID, post_name, post_parent FROM ask_posts WHERE ID = 3727 and post_type='page' [wp-includes\post.php(2107): wpdb->get_row()] 6 1.417 SELECT ID, post_name, post_parent FROM ask_posts WHERE ID = 125 and post_type='page' [wp-includes\post.php(2107): wpdb->get_row()] 29 1.390 SELECT * FROM ask_posts WHERE ID = 450 LIMIT 1 [wp-includes\post.php(227): wpdb->get_row()] 18 1.265 SELECT ID, post_name, post_parent FROM ask_posts WHERE ID = 3701 and post_type='page' [wp-includes\post.php(2107): wpdb->get_row()] 22 1.228 SELECT ID, post_name, post_parent FROM ask_posts WHERE ID = 369 and post_type='page' [wp-includes\post.php(2107): wpdb->get_row()] 24 1.140 SELECT ID, post_name, post_parent FROM ask_posts WHERE ID = 370 and post_type='page' [wp-includes\post.php(2107): wpdb->get_row()] 10 1.050 SELECT ID, post_name, post_parent FROM ask_posts WHERE ID = 125 and post_type='page' [wp-includes\post.php(2107): wpdb->get_row()] 20 1.009 SELECT ID, post_name, post_parent FROM ask_posts WHERE ID = 3753 and post_type='page' [wp-includes\post.php(2107): wpdb->get_row()] 9 0.952 SELECT ID, post_name, post_parent FROM ask_posts WHERE ID = 140 and post_type='page' [wp-includes\post.php(2107): wpdb->get_row()] 12 0.947 SELECT ID, post_name, post_parent FROM ask_posts WHERE ID = 126 and post_type='page' [wp-includes\post.php(2107): wpdb->get_row()] 30 0.947 SELECT `post_parent` FROM ask_posts WHERE ID = 442 LIMIT 1 [wp-includes\post.php(3392): wpdb->get_var()] 34 0.923 SELECT * FROM ask_posts WHERE ID = 442 LIMIT 1 [wp-includes\post.php(227): wpdb->get_row()] 26 0.855 SELECT ID, post_name, post_parent FROM ask_posts WHERE ID = 371 and post_type='page' [wp-includes\post.php(2107): wpdb->get_row()] 27 0.778 SELECT ID, post_name, post_parent FROM ask_posts WHERE ID = 125 and post_type='page' [wp-includes\post.php(2107): wpdb->get_row()] 23 0.584 SELECT ID, post_name, post_parent FROM ask_posts WHERE ID = 125 and post_type='page' [wp-includes\post.php(2107): wpdb->get_row()] 17 0.556 SELECT ID, post_name, post_parent FROM ask_posts WHERE ID = 125 and post_type='page' [wp-includes\post.php(2107): wpdb->get_row()] 32 0.556 SELECT `post_parent` FROM ask_posts WHERE ID = 442 LIMIT 1 [wp-includes\post.php(3392): wpdb->get_var()] 25 0.539 SELECT ID, post_name, post_parent FROM ask_posts WHERE ID = 125 and post_type='page' [wp-includes\post.php(2107): wpdb->get_row()] 21 0.505 SELECT ID, post_name, post_parent FROM ask_posts WHERE ID = 125 and post_type='page' [wp-includes\post.php(2107): wpdb->get_row()] 15 0.484 SELECT ID, post_name, post_parent FROM ask_posts WHERE ID = 125 and post_type='page' [wp-includes\post.php(2107): wpdb->get_row()] 11 0.481 SELECT ID, post_name, post_parent FROM ask_posts WHERE ID = 125 and post_type='page' [wp-includes\post.php(2107): wpdb->get_row()] 8 0.476 SELECT ID, post_name, post_parent FROM ask_posts WHERE ID = 125 and post_type='page' [wp-includes\post.php(2107): wpdb->get_row()] 13 0.475 SELECT ID, post_name, post_parent FROM ask_posts WHERE ID = 125 and post_type='page' [wp-includes\post.php(2107): wpdb->get_row()] 19 0.474 SELECT ID, post_name, post_parent FROM ask_posts WHERE ID = 125 and post_type='page' [wp-includes\post.php(2107): wpdb->get_row()]
So when wordpress makes this DB call -
SELECT ID, post_name, post_parent FROM ask_posts WHERE post_name = 'cancer' AND ( post_type = 'page' OR post_type = 'attachment' ) LIMIT 0 , 30
I get a result like this -
ID post_name post_parent 18 cancer 0 40 cancer 139 41 cancer 11 42 cancer 140 253 cancer 125 129 cancer 126 282 cancer 3779 295 cancer 3727 303 cancer 3701 315 cancer 3753 326 cancer 369 335 cancer 370 344 cancer 371 450 cancer 442
And then get_page_by_path() makes calls for each and every post_parent. That's okay but why repeat same calls again and again. One heavily repeated query is this -
SELECT ID, post_name, post_parent FROM ask_posts WHERE ID = 125 and post_type='page'
I hope resolution of this bug will make WordPress more efficient.
Not confident it relates but there were two Modified Preorder Tree Traversal (MPTT) projects from over the summer. You might want to take a look at where these students got their code to.