WordPress.org

Make WordPress Core

Opened 6 years ago

Closed 5 years ago

#11292 closed enhancement (duplicate)

get_page_by_path() recursively makes unnecessary database calls for a hierarchical structure

Reported by: aheadzen 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.

Change History (5)

comment:1 @lloydbudd6 years ago

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.

comment:3 @Denis-de-Bernardy6 years ago

See also: #11373 (with a patch).

comment:4 @nacin5 years ago

This a duplicate then?

comment:5 @nacin5 years ago

  • Milestone Unassigned deleted
  • Resolution set to duplicate
  • Status changed from new to closed
Note: See TracTickets for help on using tickets.