Opened 5 years ago
Last modified 5 years ago
#44921 new defect (bug)
User nicename discovery is slow to return
Reported by: |
|
Owned by: | |
---|---|---|---|
Milestone: | Awaiting Review | Priority: | normal |
Severity: | normal | Version: | 2.0 |
Component: | Users | Keywords: | has-patch needs-testing |
Focuses: | performance | Cc: |
Description
In the function wp_insert_user
it checks to is if the user nicename is in use by another user before saving. This is because, a nicename should is required to be unique. Unlike usernames, however, that rejects already in use usernames, if first checks to see if the nicename is in uses, then runs a while loop to try and find the next available nicename with a suffix. So nicename jonny becomes jonny_2 if jonny is already in use.
The behaviour is fine, however it uses a while loop to find the next available nicename, which can result in an extremely high number of queries. Take the following use case.
You have a script that generates 10000 test users for a site. The call to wp_insert_user, passed 'user_nicename' => 'test_user'
. Within the function call, it will run the while loop and find next available nicename. By the 9999th call, it would have to loop around 9999 to find the next slot, making the return of wp_insert_user extremely slow.
For testing scripts and sites with lots of registered users, this could make wp_insert_user
almost unusable.
Attachments (3)
Change History (6)
#1
@
5 years ago
I would recommend, using get_user_by('slug', $usernice);
instead of a raw SQL query, as it would at go through caches.
#2
@
5 years ago
- Keywords has-patch added
I did a first pass at this 44921.diff.
This doesn't add caching, but just replaces the raw calls to database with function calls to get_users
. Now that this is going to core, if give us more options to cache upstream.
#3
@
5 years ago
- Keywords needs-testing added
The patch 44921.2.diff adds a new helper function nicename_exists
which is similar to email_exists
.
This is a much cleaner way of calling this, my only issue with it is the kind of odd, function signature of nicename_exists
An example of where this issue is happening in the wild.