Оптимизировать большой запрос MySQL (кеширование или что-то подобное?)
Я не привык работать с такими большими объектами (хе-хе). У меня есть запрос, который проходит через все мои субдомены из запроса MySQL:
$blogs = $wpdb->get_results(
"SELECT blog_id,path FROM {$wpdb->blogs}
WHERE blog_id != {$wpdb->blogid}
AND site_id = '{$wpdb->siteid}'
AND spam = '0'
AND deleted = '0'
AND archived = '0'
order by blog_id", ARRAY_A
);
Затем я запускаю foreach для них, чтобы получить некоторые данные (в частности, название блога)
foreach( $blogs as $blog ) :
switch_to_blog( $blog[ 'blog_id' ] );
if(strpos(strtolower($blog_details->blogname), strtolower($_GET['squery'])) !== false){
//Show the site's title and link to the site
}
endforeach;
Я делаю это, потому что мне нужно, чтобы пользователи могли искать сайт по его ИМЯ, которого нет в $wpdb->blogs
Таблица. URL есть, но URL может быть smsalem", но пользователь будет искать что-то вроде"Service Master"или даже просто"Service".
Я увеличил лимит памяти до 256 МБ (это слишком высоко? Или я могу пойти выше?), Потому что я получал ошибку исчерпания памяти.
Теперь все просто отлично, и я повторил использование памяти и получил 201043248, 201mb. Мой начальный $blogs
В массиве содержится ~1400 элементов.
Это "работает", но я боюсь, что 201 МБ очень высока каждый раз, когда кто-то использует эту страницу (у нас есть выделенный сервер), мне интересно, есть ли способ немного оптимизировать это или эти цифры достаточно малы, чтобы не волноваться о (мы, вероятно, смотрим 5k+ сайтов в следующем году или два)
1 ответ
Попробуйте использовать LIMIT в своем операторе SQL, чтобы вы могли получать данные меньшими порциями.
Что-то вроде:
$result = $wpdb->get_row("SELECT COUNT(id) AS rowCount FROM {$wpdb->blogs}");
$rowCount = $result->rowCount;
for($offset=0; $offset<$rowCount; $offset+=50)
{
$blogs = $wpdb->get_results(
"SELECT blog_id,path FROM {$wpdb->blogs}
WHERE blog_id != {$wpdb->blogid}
AND site_id = '{$wpdb->siteid}'
AND spam = '0'
AND deleted = '0'
AND archived = '0'
ORDER BY blog_id
LIMIT {$offset},50", ARRAY_A);
foreach( $blogs as $blog ) :
switch_to_blog( $blog[ 'blog_id' ] );
if(strpos(strtolower($blog_details->blogname),
strtolower($_GET['squery'])) !== false){
//Show the site's title and link to the site
}
endforeach;
}
Делая это, вы определенно увеличиваете количество SQL-запросов, но в любом случае общее использование памяти будет значительно ниже. 50 меньше 1400, да.
PS: Да, для любого поиска в TEXT лучше попробовать Sphinx/Solr/ElasticSearch/ и т. Д., Поскольку MySQL не самый быстрый способ справиться с этим.