কীভাবে কয়েক মিলিয়ন পোস্টের জন্য ডব্লিউপি সাইটটি অপ্টিমাইজ করা যায়


19

আমি একটি সংস্থার জন্য একটি ওয়েবসাইটে কাজ করছি যা খুব সম্ভবত একটি কাস্টম পোস্ট ধরণের মাধ্যমে লক্ষ লক্ষ পোস্ট তৈরি করবে। তারা প্রার্থনা, সুতরাং মূলত সামনের প্রান্তের ব্যবহারকারী কেবল একটি ফর্মের মাধ্যমে একটি সংক্ষিপ্ত বাক্য জমা দেন। সমস্ত সংস্থা হ'ল পোস্ট সামগ্রী এবং পোস্টের তারিখ। সাইটটি এখনও চালু হয়নি এবং তাদের ইতিমধ্যে 120,000 এরও বেশি পোস্ট রয়েছে, তাই আমি যখন লক্ষ লক্ষ বলি তখন আমি মারাত্মক মারাত্মক dead

সুতরাং, একটি দম্পতি অপ্টিমাইজেশন প্রশ্ন:

  1. ধরা যাক, আমার কাছে কাস্টম পোস্ট টাইপের 500,000 পোস্ট রয়েছে এমন একটি বিভাগ আছে 'বৈশিষ্ট্যযুক্ত'। বৈশিষ্ট্যযুক্ত বিভাগে কেবল 500 টি পোস্ট রয়েছে। যদি আমি বৈশিষ্ট্যযুক্ত পোস্টগুলির জন্য একটি কোয়েরি তৈরি করি, তবে আমি কী পুরো 500,000 পোস্ট, বা কেবলমাত্র 500 টি বৈশিষ্ট্যযুক্ত জিজ্ঞাসা করছি? যদি আমি কেবল বৈশিষ্ট্যযুক্ত দশটি সাম্প্রতিক পোস্টগুলি প্রদর্শন করতে চাই তবে কী হবে?
  2. ডাটাবেসে এই কাস্টম পোস্টের ধরণটি সংরক্ষণ করার সময় সার্ভার সংস্থানগুলি হ্রাস করার জন্য আমি কি কিছু করতে পারি, বিশেষত যেহেতু কেবলমাত্র প্রয়োজনীয় জিনিসটির পোস্ট এবং তারিখের বিষয়বস্তু?
  3. আমি কি কাস্টম পোস্ট টাইপ ব্যবহার করা উচিত? আমি নীতিগতভাবে এটি পছন্দ করি কারণ এটি ওয়ার্ডপ্রেস অ্যাডমিনের সাথে ভালভাবে সংহত হয়েছে, তবে যদি কার্য সম্পাদনের ক্ষেত্রে উল্লেখযোগ্য অসুবিধাগুলি থাকে তবে আমি মনে করি আমি আলাদা কিছু করতে পারি।

আমি এই স্কেলে কখনও কোনও প্রকল্পে কাজ করি নি, তাই আমি স্বাভাবিকের চেয়ে পারফরম্যান্স নিয়ে কিছুটা বেশি উদ্বিগ্ন। কোন সাহায্যের জন্য ধন্যবাদ!


আপনার ওয়ার্ডপ্রেস ফাংশনগুলিতে এবং কল স্ক্রিপ্টগুলিতে যথাযথভাবে ডাটাবেস প্রশ্নগুলি রাখা গুরুত্বপূর্ণ, তবে অপ্টিমাইজেশনের একটি বৃহত অংশটি কীভাবে সার্ভার সেট আপ এবং কনফিগার করা হয় তার সাথে সম্পর্কিত। তার জন্য, সার্ভার ফল্ট নেটওয়ার্ক অনুসন্ধান করুন। serverfault.com/search?q=optimize+wordpress
আইরিন

@ রায়ানলরেমআইপসাম - মন্তব্যের জন্য ধন্যবাদ, তবে আমি আমার নির্দিষ্ট প্রশ্নের উত্তর আশা করছি। আমি সেখানে যা পেয়েছি তার বেশিরভাগই সার্ভারের সাথেই ডিল করে, ওয়ার্ডপ্রেস কীভাবে পরিচালনা করে এবং কোডের দৃষ্টিকোণ থেকে কীভাবে এটি অপ্টিমাইজ করা যায় তা নয়
জেরেমিয়া প্রুমার

উত্তর:


26

1. ডাব্লুপিউকিউয়ারি চালানোর আগে ক্যোরি সেট করুন

এটি এসকিউএল ডাটাবেসে চালিত হওয়ার আগে, কোয়েরি পরিবর্তন করার একমাত্র সুযোগ অবশ্যই, ন্যূনতমতে ডাটাবেস প্রশ্নগুলি রাখার চেষ্টা করার সময় এটি মনে রাখা সবচেয়ে গুরুত্বপূর্ণ বিষয় বলে মনে হয়।

সাধারণ প্রশ্নগুলি
একটি সাধারণ ক্যোয়ারির জন্য, ওয়ার্ডপ্রেস wp()ফাংশনটি ব্যবহার করে , যা ঘুরে ফিরে কল করে $wp->main( $query_vars )। শর্তসাপেক্ষ ট্যাগগুলি থেকে "is_ ভেরিয়েবল" সেট করার আগে সেট করা হয় WP_Query->get_posts()যা এটিকে মাইএসকিউএল ডাটাবেস কোয়েরিতে রূপান্তর করে এবং শেষ পর্যন্ত এগুলিকে $ wp_query অবজেক্টে সংরক্ষণ করে। এসকিউএল ডাটাবেসে এটি চালানোর আগে ক্যোয়ারী ফিল্টার করা সম্ভব ।

pre_get_postsক্রিয়াটি এই প্রক্রিয়ার মধ্যে হুক্স, আগে এটি প্রেরণ করা আপনি কোয়েরি পরিবর্তন করতে সক্ষম হবেন WP_Query->get_posts()

উদাহরণস্বরূপ, আপনি যদি "বৈশিষ্ট্যযুক্ত" বিভাগে পোস্টগুলির জন্য ক্যোয়ারী ফিল্টার করতে চান তবে আপনি শর্তযুক্ত ট্যাগটি ব্যবহার করতে add_action( 'pre_get_posts', 'your_function_name' );এবং এর মধ্যে অন্তর্ভুক্ত করবেন ।in_categoryyour_function_name

function your_function_name( $query ) {
    if ( $query->in_category( 'featured' ) && $query->is_main_query() ) {
        // Replace 123 with the category ID of the featured category.
        $query->set( 'cat', '123' );
    }
}
add_action( 'pre_get_posts', 'your_function_name' );

দেখুন প্লাগইন এপিআই / অ্যাকশন রেফারেন্স / পোস্ট «ওয়ার্ডপ্রেস কোডেক্স পেতে প্রাক

পৃষ্ঠাগুলি অনুরোধ
পৃষ্ঠার টেম্পলেটগুলির যেমন "বৈশিষ্ট্যযুক্ত" বিভাগের জন্য সংরক্ষণাগার পৃষ্ঠার জন্য, শর্তাধীন ট্যাগগুলি pre_get_postsফিল্টার থেকে কাজ করবে না । উদাহরণস্বরূপ, আপনি is_categoryসংরক্ষণাগার পৃষ্ঠার জন্য যাচাই করতে ব্যবহার করতে পারবেন না কারণ ডাব্লুপি_কিউয়ারি চলছে না।

পরিবর্তে, আপনাকে পৃষ্ঠার অনুরোধগুলির জন্য মূল ক্যোয়ারী পরিবর্তন করতে হবে new WP_Queryযা এমন কিছু দেখাচ্ছে $query = new WP_Query( 'cat=123' );। এটি শুরু থেকে উপযুক্ত যুক্তি দিয়ে ক্যোরি চালায়।

দেখুন ক্লাস রেফারেন্স / ডাব্লু ক্যোয়ারী «ওয়ার্ডপ্রেস কোডেক্স

২. ডাটাবেসে সংরক্ষণ করা

wp_insert_post_dataআপনার কাস্টম পোস্ট টাইপের সাথে সম্পর্কিত কেবলমাত্র $ ডেটাতে ফিরে এসেছে তা নিশ্চিত করে আপনি ফিল্টারটি ব্যবহার করতে পারেন wp_insert_post। আপনার কাস্টম পোস্টের প্রকারটি পরীক্ষা করার জন্য শর্তসাপেক্ষ বিবৃতি অন্তর্ভুক্ত করার বিষয়ে নিশ্চিত হন sure
প্লাগইন এপিআই / ফিল্টার রেফারেন্স / ডাব্লুপিপি dataোকান পোস্ট ডেটা «ওয়ার্ডপ্রেস কোডেক্স

এই হুকটিwp_insert_post ফাংশন দ্বারা ডাকা হয় , যখন আপনি নিজের কাস্টম পোস্ট প্রকারটি আপডেট করেন, সাধারণত একটি খসড়া সংরক্ষণ বা পোস্ট প্রকাশের মাধ্যমে ডাকা হয় wp_update_post

আপনাকে এটি নিজেই বেঞ্চমার্ক করতে হবে যদিও ডেটাবেসে আপডেট হওয়া ডেটা হ্রাস করার অনুকূলিতকরণের তাত্পর্য হিসাবে আমি ব্যক্তিগতভাবে বলতে পারি না।

৩. কাস্টম পোস্টের ধরণগুলি কার্য সম্পাদনকে প্রভাবিত করে?

আমার অভিজ্ঞতায়, কাস্টম পোস্টের ধরণের সামগ্রী সামগ্রী পরিচালনার জন্য একটি শক্তিশালী সরঞ্জাম। আমি কম উপায় সংস্থান ব্যবহার করতে পারে এমনভাবে অনুমতি দেয় এমন সমস্ত পদ্ধতিতে পোস্ট পরিচালনা করার অন্য কোনও উপায় সম্পর্কে আমি জানি না। আমি ব্যক্তিগতভাবে যেখানেই সম্ভব প্রশ্নের তৈরি সংখ্যা হ্রাস করার উপায়গুলি সন্ধানের জন্য ব্যক্তিগতভাবে ফোকাস করব।

পারমালিঙ্ক কাঠামোর সাথে সম্পর্কিত কোনও পারফরম্যান্স সমস্যা থাকত যখন এটি সংখ্যার পরিবর্তে পাঠ্য দিয়ে শুরু হয় তখন এটি হিট করে। 3 এটি বিশেষত বিপুল সংখ্যক পৃষ্ঠাগুলি হোস্ট করার সাইটের জন্য সমস্যাজনক ছিল তবে ওয়ার্ডপ্রেস সংস্করণ ৩.৩ থেকে এটি সমাধান হয়েছে।

আমি কেবল এখানে পারমালিক্স আনছি কারণ স্লাগ সাধারণত পারমলিংক কাঠামোর প্রথম অংশ যা সংস্করণ 3.3 এর আগে পারফরম্যান্সকে প্রভাবিত করতে পারে বা নাও পারে। এ ছাড়া আমি কাস্টম পোস্ট ধরণের ব্যবহার থেকে উত্পন্ন কোনও পারফরম্যান্স সমস্যা সম্পর্কে সচেতন নই।

অন্যান্য কর্মক্ষমতা বিকল্প

Transients
এটি আপনার কোডে ন্যূনতম প্রশ্নের রাখার জন্য একটি প্রতিস্থাপন নয়, কিন্তু আপনি ব্যবহার করতে পারেন set_transient কিছু সময়ের জন্য প্রশ্নের সঞ্চয় করতে যাতে নতুন প্রশ্নের প্রয়োজনীয় নয়। ডেভ ক্লিমেন্টসের পোস্টে ব্যবহৃত উদাহরণটি এখানে । এছাড়াও, নোট করুন যে save_postকোনও প্রদত্ত পোস্টের ধরণটি আপডেট হওয়ার পরে অস্থায়ীটি মুছতে তিনি কোনও পদক্ষেপ যুক্ত করার পরামর্শ দিয়েছেন।

<?php // IN THE SPOTLIGHT QUERY
if( false === ( $its_query = get_transient( 'its_query' ) ) ) {
    $pttimestamp = time() + get_option('gmt_offset') * 60*60;
    $its_query = new WP_Query( array(
        'post_type' => 'spotlight',
        'posts_per_page' => 1,
            'post__not_in' => $do_not_duplicate,
        'meta_query' => array(
            array(
                'key' => '_hpc_spotlight_end_time',
                'value' => $pttimestamp,
                'compare' => '>'
            )
        )
    ) );
    set_transient( 'its_query', $its_query, 60*60*4 );
}
if( have_posts() ) { // HIDE SECTION IF NO CURRENT ITS FEATURE ?>
    // LOOP GOES HERE: NOT IMPORTANT TO EXAMPLE
<?php } ?>

আরও ক্যোয়ারী অপ্টিমাইজেশান
টমাস গ্রিফিনের তার অপ্টিমাইজ ওয়ার্ডপ্রেস কোয়েরি টিউটোরিয়ালটিতে কয়েকটি ভাল টিপস রয়েছে । এখানে তার পরামর্শগুলির একটি সংক্ষিপ্ত তালিকা:

  • 'cache_results' => falseযদি আপনার সার্ভার মেমকেচডের মতো অবিরাম ক্যাশে ব্যবহার না করে তবে এক-অফ ক্যোয়ারী সেট করুন । ওয়ান-অফ ক্যোয়ারীগুলি "এমন কোয়েরি হিসাবে বর্ণনা করা হয় যা খুব অল্প পরিমাণে ডেটা দেখানোর জন্য ব্যবহৃত হয় It এটি এমন হতে পারে যে আপনি কেবল বর্তমান পোস্টের সাথে সম্পর্কিত লিঙ্কযুক্ত পোস্টের শিরোনাম প্রদর্শন করতে চান, বা আপনি নির্বাচনের জন্য পোস্টের একটি ড্রপডাউন প্রদর্শন করতে চাইতে পারেন একটি নির্দিষ্ট বিকল্প সেটিংস। "

    তার উদাহরণ: $query = get_posts( array( 'posts_per_page' => 1, 'cache_results' => false ) );

  • 'no_found_rows' => trueপৃষ্ঠা নির্ধারণের প্রয়োজন নেই যেখানে সেট করুন । এটি "মাইএসকিউএলকে ফলাফল গণনা করে বাইপাস করবে আমাদের প্যাফিকেশন দরকার কিনা তা দেখার জন্য।"

    তার উদাহরণ: $query = new WP_Query( array( 'posts_per_page' => 1, 'no_found_rows' => true ) );

  • পোস্ট আইডির অনুসন্ধান কেবলমাত্র যদি আপনার এটির প্রয়োজন 'fields' => 'ids' হয় get_posts। এটি ডেটাবেসের বিবরণ «ওয়ার্ডপ্রেস কোডেক্সের দিকে নজর দিলে ডেটা পরিমাণে উল্লেখযোগ্যভাবে হ্রাস করা উচিত, যা প্রতি পোস্টে যথেষ্ট is

    তার উদাহরণ: $query = get_posts( array( 'posts_per_page' => 1, 'fields' => 'ids' ) );

এই শেষ টিপটি ছাড়াও, আপনি যখন get_post_field ব্যবহার করে কেবল এক বা কয়েকটি পোস্ট ক্ষেত্র প্রয়োজন তখন একই যুক্তি প্রয়োগ করা যেতে পারে ।

কীভাবে ক্যোয়ারী কাজ করে তার একটি দৃ understanding় বোঝা থাকা অপরিহার্য। আপনি আপনার প্রশ্নের সাথে আরও সুনির্দিষ্ট হতে পারেন, আপনি আপনার এসকিউএল ডাটাবেস থেকে কম কাজের দাবি করবেন। এর অর্থ ডাটাবেস অনুসন্ধান পরিচালনা করার জন্য বিশাল সম্ভাবনা রয়েছে। কাস্টম ক্যোয়ারীগুলি যেখানে চালিত হয় সেদিকে সতর্ক থাকুন (এটি কোনও অ্যাডমিন পৃষ্ঠা?), সরাসরি অনুসন্ধানগুলিতে যথাযথ স্যানিটাইজেশন ব্যবহার করুন এবং দেশীয় ওয়ার্ডপ্রেস ফাংশনগুলি ব্যবহার করার চেষ্টা করুন যেখানে এটি আপনাকে একই কর্মক্ষমতা অর্জন করতে দেয়।


2
দুর্দান্ত এবং অত্যন্ত সহায়ক উত্তর, আপনাকে ধন্যবাদ!
যিরমিয় প্রারমার

থিমটি সম্পূর্ণরূপে কাস্টম নির্মিত তাই আমরা আক্ষরিকভাবে কেবল একেবারে প্রয়োজনীয় আইটেমগুলিকে জিজ্ঞাসা করছি। যদিও এটি অত্যন্ত সহায়ক। এটি দিয়ে আমি আবার যেতে যাব এবং আমার প্রশ্নের কিছু পরিবর্তন করব। ;)
যিরমিয় প্রার্মার

1
আমি যুক্ত করব যে যেখানেই সম্ভব আপনার মেটা প্রশ্নগুলি এড়ানো উচিত। অবশ্যই দুটি মেটা ক্ষেত্রের বিরুদ্ধে একযোগে কোনও ক্যোয়ারী চালাবেন না। এটি ডাবল এবং ট্রিপল ক্যোয়ারিতে ফলাফল দেয় যা দ্রুত পারফরম্যান্সের নিগমায়ারে পরিণত হয়। কাস্টম পোস্টের ধরণগুলি প্রায়শই এটিতে সহায়তা করতে পারে।
চার্লস জাইমেট

3

আমি আরও যোগ করেছি:

    'no_found_rows'          => true,
    'update_post_term_cache' => false,
    'update_post_meta_cache' => false,
    'cache_results'          => false
  • no_found_rows (বুলিয়ান) - আপনার যখন কোনও পৃষ্ঠা বাছাইয়ের প্রয়োজন নেই এবং মোট পোস্টের সন্ধানের জন্য গণনা করার প্রয়োজন নেই তখন এটি সত্য করুন।
  • cache_results (বুলিয়ান) - তথ্য ক্যাশে পোস্ট করুন।
  • আপডেট_পোস্ট_মেটা_ক্যাচে (বুলিয়ান) - মেটা তথ্য ক্যাশে পোস্ট করুন।
  • update_post_term_cache (বুলিয়ান) - পোস্ট টার্ম তথ্য ক্যাশে।

এই পরামিতিগুলি ব্যবহার করে এবং FALSE হিসাবে মানগুলি পাস করার মাধ্যমে আমরা কিছু অতিরিক্ত ডেটাবেস কোয়েরি কার্যকর করা বন্ধ করে কোয়েরিটিকে আরও দ্রুত করতে পারি।

দ্রষ্টব্য: আমাদের এই পরামিতিগুলি সর্বদা ব্যবহার করা উচিত নয় কারণ ক্যাশে জিনিস যুক্ত করা সঠিক জিনিস, তবে এটি নির্দিষ্ট পরিস্থিতিতে কার্যকর হতে পারে এবং আপনি যখন কী করছেন জানেন তখন আপনার ব্যবহারের বিষয়টি বিবেচনা করা উচিত।

দয়া করে ভিজিট করুন: https://drujoopress.wordpress.com/2013/06/27/how-to-optimize-wordpress-query-to-get-results-faster/#more-184


1
দয়া করে আপনার উত্তর সম্পাদনা করুন , এবং একটি ব্যাখ্যা যুক্ত করুন: কেন এটি সমস্যার সমাধান করতে পারে?
ফুসিয়া

আমি এই উত্তরে আমার মন্তব্য যুক্ত করতে পারি না: wordpress.stackexchange.com/a/166699/57674
rigosan

1

সমস্ত অকাল অপটিমাইজেশন ধরণের প্রশ্ন হিসাবে সঠিক ব্যবহারের ধরণগুলি না জেনে এটির সত্যিকারের উত্তর দেওয়া যায় না যা আপনি যখন লাইভ থাকেন কেবল তখনই বহুবার সন্ধান করা হয়।

সাধারণভাবে, প্রতি এমওয়াইএসকিউএল স্প্যাকগুলিতে ডেটার পরিমাণের সাথে কোনও সমস্যা হওয়া উচিত নয়। অবশ্যই সেরা অ্যালগরিদমের সাথেও অনুসন্ধানের ডেটা অনেক ছোট টেবিলের সাথে ধীর হবে তবে এর সমাধান সহজ, শক্তিশালী সিপিইউ।

কীভাবে মেটা ডেটা সংরক্ষণ করা হয় (উদাহরণস্বরূপ পিং সম্পর্কিত তথ্য সংরক্ষণ না করা) আপনি অনুকূলিত করতে চাইতে পারেন, তবে এই ধরণের জিনিসটি আপনি যা করেন ঠিক তার উপর নির্ভর করে এবং শেষ পর্যন্ত আপনার আরও শক্তিশালী সিপিইউ প্রয়োজন হতে পারে তাই আপনার সমস্যার উপযুক্ত নাও হতে পারে ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.