মাইএসকিউএল এর ফুলটেক্স ইনডেক্সের তুলনায় ম্যাচের চেয়েও কেন 4x এর চেয়ে বেশি দ্রুত?


12

আমি এটা পাচ্ছি না

আমি এই সূচী সঙ্গে একটি টেবিল পেয়েছি

PRIMARY     post_id
INDEX       topic_id
FULLTEXT    post_text

সারণীতে (কেবল) 346,000 সারি রয়েছে। আমি 2 টি ক্যোয়ারী করার চেষ্টা করছি।

SELECT post_id 
FROM phpbb_posts 
WHERE topic_id = 144017 
AND post_id != 155352 
AND MATCH(post_text) AGAINST('http://rapidshare.com/files/5494794/photo.rar')

সময় লাগে 4.05 সেকেন্ড

SELECT post_id 
FROM phpbb_posts 
WHERE topic_id=144017 
AND post_id != 155352 
AND post_text LIKE ('%http://rapidshare.com/files/5494794/photo.rar%')

0.027 সেকেন্ড সময় নেয়।

ব্যাখ্যা করুন দেখায় যে কেবলমাত্র পার্থক্য fulltextসম্ভব_কিজে রয়েছে ( পোস্ট_টেক্সট অন্তর্ভুক্ত রয়েছে, LIKEনেই)

সত্যিই অদ্ভুত।

এর পিছনে কী? ব্যাকগ্রাউন্ডে কি হচ্ছে? LIKEসূচক এবং ফুলটেক্সটকে এর সূচকটি ব্যবহার করার সময় এত ধীর গতিতে কীভাবে করা যেতে পারে?

UPDATE1:

প্রকৃতপক্ষে এটি এখন প্রায় 0.5 সেকেন্ড সময় নেয়, সম্ভবত টেবিলটি লক হয়ে গিয়েছিল, তবে এখনও, আমি যখন প্রোফাইলিং চালু করি তখন এটি দেখায় যে ফুলটেক্সট সূচনাটি 0.2 সেকেন্ড নিয়েছে। কি খবর?

আমি আমার টেবিলটিতে LIKEসেকেন্ডে 10x, পুরো টেক্সট 2x সহ জিজ্ঞাসা করতে পারি

UPDATE2:

আশ্চর্য!

mysql> SELECT post_id FROM phpbb_posts WHERE post_id != 2 AND topic_id = 6 AND MATCH(post_text) AGAINST ('rapidshare.com');
Empty set (0.04 sec)

সুতরাং আমি জিজ্ঞাসা করছি, এটি কীভাবে সম্ভব?

উপরন্তু,

SELECT count(*) FROM phpbb_posts WHERE MATCH(post_text) AGAINST ('rapidshare.com')

সত্যিই ধীর। ফুলটেক্সট কি কোনও ভাঙা যাবে?

UPDATE3:

কি খারাপ অবস্থা?

SELECT forum_id, post_id, topic_id, post_text  FROM phpbb_posts  WHERE MATCH(post_text) AGAINST ('rapidshare.com') LIMIT 0, 30;

সময় লাগে 0.27s

SELECT count(*) FROM phpbb_posts  WHERE MATCH(post_text) AGAINST ('rapidshare.com') LIMIT 0, 30;

৩০ সেকেন্ডেরও বেশি সময় লাগে! এখানে কি ভুল হচ্ছে?


দুটির মধ্যে একাধিক রানের তুলনায় প্রতিক্রিয়া সময়গুলি কী? আমি মনে করতে প্ররোচিত হয়েছি যে ডিস্কের ক্যাশেটি সম্ভবত কার্যকর হবে যেখানে প্রথম "ধীর" পরীক্ষাটি প্রয়োজনীয় সমস্ত ডেটা রামের মধ্যে লোড করে রাখে যাতে দ্বিতীয় "দ্রুত" ক্যোয়ারীটি খুব দ্রুত।
atxdba


এটি বেশ পুরানো প্রশ্ন / উত্তর। সেই দিন থেকে মাইএসকিএল / মারিয়াদব থেকে কোনও অগ্রগতি?
রোমান সুসি

1
সতর্কতা: এই প্রশ্নোত্তরের সময় থেকে বোঝা যাচ্ছে যে এটি কেবল মাইআইএসএএম সম্পর্কে কথা বলছে। InnoDB এর ক্ষেত্রে এর প্রয়োগতা প্রশ্নবিদ্ধ।
রিক জেমস

@ রোমানসুসী - আপনি কি ইনোডিবি-র লক্ষ্য করে একটি নতুন প্রশ্ন শুরু করতে চান?
রিক জেমস

উত্তর:


2

আমি মনে করি সমস্যাটি পুরোপুরি সূচক নিজে থেকেই উপস্থিত হতে পারে।

প্রতিবার কোনও ফুলটেক্স ইনডেক্সের সাথে জড়িত কোনও ক্যোয়ারী রয়েছে, মাইএসকিউএল ক্যোয়ারী অপটিমাইজার একটি সম্পূর্ণ টেবিল স্ক্যানে ক্যোয়ারীটিকে ঝাপটায়। আমি কয়েক বছর ধরে এটি দেখেছি। আমিও ফুলটেক্স ইনডেক্সে এই সর্বাধিক সাবলীল আচরণ সম্পর্কে পূর্ববর্তী পোস্ট লিখেছি

আপনার দুটি জিনিস করার প্রয়োজন হতে পারে:

  1. রিফ্যাক্টর ক্যোয়ারী যাতে ফুলটেক্স ইনডেক্সটি মাইএসকিউএল কোয়েরি অপটিমাইজারকে বিভ্রান্তির অবস্থায় ফেলে না দেয়
  2. একটি অতিরিক্ত সূচক যুক্ত করুন যা সঠিকভাবে রিফ্যাক্টর ক্যোয়ারিকে সমর্থন করবে

QUERY রেফ্যাক্টর

আপনার মূল জিজ্ঞাসাটি এখানে

SELECT post_id  
FROM phpbb_posts  
WHERE topic_id = 144017  
AND post_id != 155352  
AND MATCH(post_text) AGAINST('http://rapidshare.com/files/5494794/photo.rar') 

আপনার ক্যোয়ারীটি এভাবে রিফ্যাক্টর করতে হবে:

SELECT subqueryA.post_id
FROM
(
    SELECT post_id FROM phpbb_posts
    WHERE topic_id = 144017
    AND post_id != 155352
) subqueryA
INNER JOIN
(
    SELECT post_id FROM phpbb_posts
    WHERE MATCH(post_text) AGAINST('http://rapidshare.com/files/5494794/photo.rar')
) subqueryB
USING (post_id);

একটি নতুন সূচক তৈরি করুন

সমর্থন করার জন্য আপনার একটি সূচক প্রয়োজন হবে subqueryA। আপনার ইতিমধ্যে একটি সূচক রয়েছে topic_id। আপনাকে এটি নীচে প্রতিস্থাপন করতে হবে:

ALTER TABLE phpbb_posts ADD INDEX topic_post_ndx (topic_id,post_id);
ALTER TABLE phpbb_posts DROP INDEX topic_id;

একবার চেষ্টা করে দেখো !!!

আপডেট 2012-03-19 13:08 ইডিটি

প্রথমে এটি চেষ্টা করে দেখুন

SELECT post_id FROM
(
    SELECT * FROM phpbb_posts
    WHERE topic_id = 144017
    AND post_id != 155352
) A;

যদি এটি দ্রুত চলে এবং কয়েকটি সংখ্যক সারি ফেরত দেয়, তবে এই নেস্টেড সাবকোয়ারিটি চেষ্টা করুন:

SELECT post_id FROM
(
    SELECT * FROM phpbb_posts
    WHERE topic_id = 144017
    AND post_id != 155352
) A
WHERE MATCH(post_text) AGAINST('http://rapidshare.com/files/5494794/photo.rar');

আপডেট 2012-03-19 13:11 ইডিটি

এর চলমান সময়ের সাথে তুলনা করুন:

SELECT count(*) FROM phpbb_posts  WHERE MATCH(post_text) AGAINST ('rapidshare.com') LIMIT 0, 30;

এর সাথে

SELECT count(*) FROM phpbb_posts WHERE 1 = 1;

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


সুতরাং আপনি বলতে চান যে আমার ক্যোয়ারীটি পুরো টেবিলটি স্ক্যান করে কারণ টপিক_আইডি এবং post_idএটি বিভ্রান্ত করে? এই কলামগুলিতে সূচী না রেখেও কেন লাইক কোয়েরি কাজ করে (টপিক_আইডি, পোস্ট_আইডি)? এমওয়াইএসকিউএল কেন topic_id = 144017 AND post_id != 155352এই ফলাফলগুলির মাধ্যমে কেবল বুদ্ধিমানভাবে নির্বাচন না করে কেবল ব্রাউজার করবে? এবং যদি 100k সারিগুলিতে আমার ফুলটেক্সট অনুসন্ধানের স্ট্রিং অন্তর্ভুক্ত থাকে post_text? এটি সব নির্বাচন করবেন না?
জেনিসিস

আসলে আমি আরও বিভ্রান্ত। '% টেক্সট%' এর মতো সূচিগুলিও ব্যবহার করে না, এর অর্থ এটি পুরো টেবিলটি স্ক্যান করে, তাই এটি এত দ্রুত কেন?
জেনেসিস

দয়া করে আমার আপডেটটি দেখুন , আমি মনে করি আপনি এটি খুব দ্রুত সমাধান করবেন। আপনি যদি সমাধান করেন তবে আমি আপনাকে আমার প্রতিনিধি দেব।
বংশোদ্ভূত

আপনার দ্বিতীয় আপডেটে উত্তর। দ্বিতীয় ক্যোয়ারী 0.01 মিমি এরও কম সময়ে চলেছিল, প্রথমটি শেষ হয়নি। আপনি কেন বলেছিলেন "যদি সেখানে চলমান সময় একই হয় তবে ম্যাচের ধারাটি প্রতিটি সারিতে কার্যকর করা হচ্ছে।" ? এটি যা হওয়া উচিত তার ঠিক বিপরীত নয়? আপনি যদি এখানে সন্ধান করেন তবে আপনি দেখতে পাবেন যে আমি এই সমস্যাটির সাথে একা নই
জেনেসিস

আপনার প্রথম আপডেটের উত্তর। প্রথম ক্যোয়ারী 0.01 মিমি, 0 টি সারিতে চলেছিল, দ্বিতীয়টি ফিরে এসেছে "কলামের তালিকার সাথে মেলে পুরো পাঠ্য সূচিটি খুঁজে পাচ্ছে না"। তবে 2 টি সাবকিউরিয়াস সহ আপনার ক্যোয়ারী পুরোপুরি কাজ করে!
জেনিসিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.