মাইএসকিউএলে স্থানিক সূচকগুলি ব্যবহার করার সময় খারাপ পারফরম্যান্স


13

স্ট্যাক ওভারফ্লোতে জিজ্ঞাসিত প্রশ্নের পুনরায় পোস্ট করার পরামর্শ দেওয়া হয়েছিল যে এটি একটি আরও ভাল ফোরাম হবে।

আমি কোনও ডেটা সেটটি পুশ করার জন্য সামান্য পরীক্ষা করার চেষ্টা করছি যা ভূ-স্থানিক নয় তবে এটি বেশ ভালভাবে ফিট করে এবং কিছুটা উদ্বেগের ফলাফল খুঁজে পাচ্ছি। ডেটা সেট হ'ল জিনোমিক ডেটা যেমন হিউম্যান জিনোম যেখানে আমাদের ডিএনএর একটি অঞ্চল থাকে যেখানে জিনের মতো উপাদানগুলি নির্দিষ্ট শুরু করে এবং স্থানাঙ্কগুলি বন্ধ করে দেয় (আমাদের এক্স অক্ষ)। আমাদের ডিএনএ (ক্রোমোসোম) এর একাধিক অঞ্চল রয়েছে যা Y অক্ষকে দখল করে। লক্ষ্যটি হ'ল সমস্ত আইটেম যা একটি একক ওয়াই স্থানাঙ্ক হিসাবে লাইন স্ট্রিং (START 1, END 2) বরাবর দুটি এক্স স্থানাঙ্ককে ছেদ করে back

তত্ত্বটি দুর্দান্ত বলে মনে হয়েছিল তাই আমি এটিকে একটি বিদ্যমান মাইএসকিউএল ভিত্তিক জিনোম প্রকল্পে ঠেলে দিয়েছি এবং একটি সারণী কাঠামো নিয়ে এলাম:

CREATE TABLE `spatial_feature` (
  `spatial_feature_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `external_id` int(10) unsigned NOT NULL,
  `external_type` int(3) unsigned NOT NULL,
  `location` geometry NOT NULL,
  PRIMARY KEY (`spatial_feature_id`),
  SPATIAL KEY `sf_location_idx` (`location`)
) ENGINE=MyISAM;

external_idআমরা এই টেবিলটিতে external_typeএনকড করে রেখেছি এমন সত্তার সনাক্তকারীকে উপস্থাপন করে এবং এর উত্সকে এনকোড করে। সবকিছু দেখতে ভাল লাগছিল এবং আমি কিছু প্রাথমিক তথ্য (30,000 সারি) এ ধাক্কা দিয়েছি যা দেখে মনে হয় এটি ভাল কাজ করে। এটি অতীতে যখন 3 মিলিয়ন সারি চিহ্ন মাইএসকিউএল স্থানিক সূচকটি ব্যবহার করতে অস্বীকার করেছিল এবং যখন এটি ব্যবহার করতে বাধ্য হয় তখন ধীর হয় (40 সেকেন্ড বনাম 5 সেকেন্ড পূর্ণ টেবিল স্ক্যান ব্যবহার করে)। যখন আরও ডেটা যুক্ত করা হয় তখন সূচকটি ব্যবহার করা শুরু হয় তবে কার্যক্ষমতা পেনাল্টি বহাল থাকে। জোর করে সূচি বন্ধ করে ক্যোরিটি 8 সেকেন্ডে নামিয়ে আনল। আমি যে ক্যোয়ারীটি ব্যবহার করছি তা দেখে মনে হচ্ছে:

select count(*)
from spatial_feature
where MBRIntersects(GeomFromText('LineString(7420023 1, 7420023 1)'), location);

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

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

  • ম্যাকোস 10.6.6
  • মাইএসকিউএল 5.1.46

উত্তর:


5

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

Http://rickonrails.wordpress.com/2009/03/30/big-ole-mysql-spatial-table-optimization-tricks/ থেকে

আপনি যদি টেবিলের সমস্ত ডেটা মেমরির সাথে ফিট করতে পারেন তবে আপনার অভিনয়টি ভাল। যদি / আপনার যখন ডিস্ক রিড করা শুরু করতে হয়, তখন পারফরম্যান্সটি খুব খারাপ হয়ে যায়। আপনি কি দুটি ক্ষেত্রে আপনার মাইএসকিএল উদাহরণের মেমরি ব্যবহারের নিদর্শনগুলি করছেন: 30 কে সারি বনাম 3000 কে সারি?


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

5

আপনার মাইএসকিএল ইনস্টলেশন বা .ini সেটিংসের সাথে অবশ্যই কিছু ভুল হতে পারে। আমার পুরানো ম্যাক (10.6.8 / মাইএসকিউএল 5.2) এ সবেমাত্র একটি জিওপ্যাসিয়াল সূচক পরীক্ষা করা হয়েছে। এই কনফিগারেশনটি আপনার অনুরূপ এবং আমি বড় জিওডাটা ডাম্প ( 9 মিলিয়ন রেকর্ড ) পরীক্ষা করেছি। আমি এই প্রশ্নটি করেছি:

SET @radius = 30;
SET @center = GeomFromText('POINT(51.51359 7.465425)');
SET @r = @radius/69.1;
SET @bbox = CONCAT('POLYGON((', 
  X(@center) - @r, ' ', Y(@center) - @r, ',', 
  X(@center) + @r, ' ', Y(@center) - @r, ',', 
  X(@center) + @r, ' ', Y(@center) + @r, ',', 
  X(@center) - @r, ' ', Y(@center) + @r, ',', 
  X(@center) - @r, ' ', Y(@center) - @r, '))' 
);

SELECT geonameid, SQRT(POW( ABS( X(point) - X(@center)), 2) + POW( ABS(Y(point) - Y(@center)), 2 ))*69.1 
AS distance
FROM TABLENAME AS root
WHERE Intersects( point, GeomFromText(@bbox) ) 
AND SQRT(POW( ABS( X(point) - X(@center)), 2) + POW( ABS(Y(point) - Y(@center)), 2 )) < @r 
ORDER BY distance; 

এটি গ্রহণ করেছে মাত্র 0.0336 সেকেন্ড।

আমি উপরের ক্যোয়ারী যেমন টেবিলের মধ্যে তুলনা করার জন্য ব্যবহার করি যেখানে @ সেন্টারের জন্য কেবলমাত্র ল্যাট / ল্যাঙ্গুয়েজ মানগুলি এসেছে সেখানকার সিটি_লিটটিউড / সিটি_লম্বিটিড এবং 9-12 মিয়ো থেকে একটি সরল আইএনডিএক্স রয়েছে where জিওন থেকে টেবিলের একটি ভূ-স্থানিক সূচক রয়েছে।

এবং আমি কেবল এটি যুক্ত করতে চেয়েছিলাম যে যখন কেউ একটি টেবিলের মধ্যে বড় ডেটা INোকায় এটি ইনসার্টের পরে সূচকটি যুক্ত করতে আরও পারফরম্যান্স হতে পারে। যদি না হয় তবে প্রতিটি সংযুক্তি যুক্ত করার জন্য এটি আরও বেশি সময় নেবে ... [তবে এটি গুরুত্বপূর্ণ নয়]


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

ব্যাসার্ধের সাথে যেখানে বিধিটি সূচকটি ব্যবহার করে টেবিলের একটি ভাল অংশ ফিল্টার করতে পারে।
tmarthal

2

আপনি কি এটি একটি একক 2D কলামের পরিবর্তে দুটি 1D কলামে ভাঙ্গার কথা ভাবেন?

অপ্টিমাইজারটি একই ধরণের সমস্ত ডেটা দমিয়ে রাখতে পারে এবং আরও দুটি ধরণের কলাম যুক্ত হতে পারে।

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


দুর্ভাগ্যক্রমে 1 টি মাত্রা অন্য মাত্রার তুলনায় যথেষ্ট কম জনবহুল। এটিকে প্রসঙ্গে উপস্থাপনের জন্য মানব জিনোমে 24 টি স্বতন্ত্র ক্রোমোজোম (22 জোড়া এবং দুটি যৌন ক্রোমোজোম) রয়েছে এমন একটি ব্যাগের ডেটা যা বিভিন্ন স্তরে একত্রিত করা হয়েছিল। যার অর্থ যদি আপনি মৌলিক ব্যবহারের ক্ষেত্রে উপাদানগুলিকে মানচিত্র করেন যা এক মাত্রায় 24 টি স্বতন্ত্র শনাক্তকারী। আসল আশাটি ছিল যে আর-ট্রি ইনডেক্স কেবল আরও পারফরম্যান্ট ওভারল্যাপিং রেঞ্জ চেকগুলিই সম্পাদন করতে সক্ষম হতে পারে তবে একক কোয়েরিতে এই অঞ্চলগুলির মধ্যে পার্থক্য করতে সক্ষম হয়েছিল।
andeyatz
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.