web-dev-qa-db-fra.com

wp_insert_post extrêmement lent sur une grande table, requête directe très rapide

Mon tableau de messages est d'environ 600K, et je ne considère pas cela du tout grand. Quoi qu'il en soit, wp_insert_post devient très lent. J'essaie d'importer une liste énorme d'informations sur les hôtels dans les postes. La liste est d'environ 1500K grande. L’insertion de messages commence bien à 200-400 messages par seconde, mais elle chute considérablement à environ 20-10 messages par seconde lorsque le nombre de messages atteint 400 000.

Lorsque je fais une requête directe sur la table des publications, il insère à nouveau 400 publications par seconde. Donc, ma conclusion est que wp_insert_post ralentit considérablement les choses.

J'ai essayé quelques astuces pour améliorer la vitesse de wp_insert_post, telles que:

wp_defer_term_counting( false );
wp_defer_comment_counting( false );
$wpdb->query( 'SET autocommit = 0;' );

et après l'importation en vrac:

wp_defer_term_counting( true );
wp_defer_comment_counting( true );
$wpdb->query( 'SET autocommit = 1;' );
$wpdb->query( 'COMMIT;' );

mais cela n'aide pas à améliorer la vitesse d'insertion, en réalité l'amélioration est nulle.

Quelqu'un peut-il m'expliquer s'il vous plaît ce que 'check' dans la fonction wp_insert_post le ralentit?

Est-ce que c'est la colonne 'post_name' AKA slug? ça doit être unique, non? Y a-t-il d'autres colonnes qui sont cochées?

J'aimerais savoir ce qui est vérifié ou ce qui doit être vérifié car je songe sérieusement à remplacer la fonction wp_insert_post par la mienne pour accélérer les choses.

merci d'avance

edit - a ajouté ma boucle:

foreach($hotels as $key => $hotel) {

    $slug  = $hotel->HotelName;
    $title = $hotel->HotelName;


if ($hotel->translation == NULL) {
    $description = $hotel->Overview;
    } else {
    $description = $hotel->translation;
    }

    $hotel_id = wp_insert_post(
        array(
            //'ID'              =>  $hotel->id,
            'post_mime_type'    =>  $hotel->id,
            'comment_status'    =>  'closed',
            'ping_status'       =>  'closed',
            'post_author'       =>  $author_id,
            'post_name'         =>  $slug,
            'post_title'        =>  $title,
            'post_status'       =>  'publish',
            'post_type'         =>  'hotel',
            'post_content'      =>  $description, )
    );

    } 
6
user1973842

vous devriez inverser le code, vous devriez ajouter ceci avant l'importation

wp_defer_term_counting( true );
wp_defer_comment_counting( true );

ne le définissez pas faux et après l'importation vous le définissez vrai, vous devez faire la chose oppsite
J'ai eu le même problème pour insérer 50 messages, cela a pris environ 7 minutes après avoir ajouté ce code avant le wp_insert_post, cela ne m'a pris que 7 secondes.
et vous pouvez aussi ajouter ceci

define( 'WP_IMPORTING', true );

et après avoir importé la publication, ajoutez ceci et exécutez le script

wp_defer_term_counting( false );
wp_defer_comment_counting( false );

Essayez de modifier la base de données pour améliorer la vitesse de recherche du champ post_name ...

ALTER TABLE `wp_posts` ADD INDEX (`post_name`);

Vous voulez éviter d'écrire votre propre remplacement wp_insert_post() car de petites astuces se produisent dans des endroits inattendus et deviennent un véritable casse-tête pour un débogage ultérieur.

2
BA_Webimax