মাইএসকিএলে নিকটতম প্রতিবেশী অনুসন্ধানকে কীভাবে কার্যকর করা যায়?


10

সুতরাং, সংক্ষেপে,

  1. অক্ষাংশ এবং দ্রাঘিমাংশের ডেটা ধরণটি কী হওয়া উচিত?
  2. উদাহরণস্বরূপ প্রথম 100 নিকটবর্তী রেস্তোরাঁ পেতে আমার কী এসকিউএল আদেশটি কল করা উচিত?

বিস্তারিত:

আমার কাছে দ্রাঘিমাংশ এবং দ্রাঘিমাংশ সহ প্রতিটি 100k বিজ রেকর্ড রয়েছে। আমি দেখছি যে মাইএসকিউএল আসলে পয়েন্ট নামক একটি ডেটা টাইপ সমর্থন করে। পরিবর্তে আমি এটি ব্যবহার করা উচিত?

মাইএসকিউএল কি কেডিট্রি স্টোরেজ সিস্টেমকে http://en.wikedia.org/wiki/File:KDTree-animation.gif সমর্থন করে

অক্ষাংশ এবং দ্রাঘিমাংশ সংরক্ষণ করার জন্য নিয়মিত ফ্লোট ডেটা টাইপের চেয়ে পয়েন্ট ডেটা টাইপ ব্যবহার করা কি ভাল?

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

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

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

আমি এ সম্পর্কে আরও কোথায় জানতে পারি? ধন্যবাদ।



দেখে মনে হচ্ছে সমাধানটি এখানে dba.stackexchange.com/questions/4210/… সেরা সমাধান। আমি বোঝাতে চাইছি এখানে MYSQL স্থানিক বলা আছে ati তবে আপনি কোথায় (দূরত্ব (x) <20) এর মতো জিনিসগুলি বের করতে পারবেন না। এটি এখনও কার্যকর হয়নি।
user4951

উত্তর:


11

নকশা নিদর্শন হিসাবে, Yelp প্রশ্ন বেশ মান স্টাফ।

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

তাদের স্লাইড থেকে:

set @orig_lat=122.4058; set @orig_lon=37.7907;
set @dist=10;

SELECT *, 3956 * 2 * ASIN(SQRT(
POWER(SIN((@orig_lat - abs(dest.lat)) * pi()/180 / 2), 2) +  COS(@orig_lat * pi()/180 ) * COS(abs(dest.lat) * pi()/180) *  POWER(SIN((@orig_lon  dest.lon) * pi()/180 / 2), 2) )) as  distance
FROM hotels dest 
having distance < @dist
ORDER BY distance limit 10

স্ট্যাক ওভারফ্লোতে ভূ-স্থানিক দূরত্ব সম্পর্কে আরও দীর্ঘ, আরও গভীরতর উত্তর রয়েছে ।

আপনি এখনও অক্ষাংশ এবং দ্রাঘিমাংশ দ্বারা ফলাফল সীমাবদ্ধ করতে চান।

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

একটি শেষ লিঙ্ক: আপনি স্থানিক সূচকগুলি ব্যবহার করে প্রশ্নের গতি বাড়ানোর বিষয়ে এই এসও থ্রেডটিও দেখতে চাইতে পারেন ।


[ক্যোয়ারী 4 তে ত্রুটি] আপনার এসকিউএল সিনট্যাক্সে আপনার একটি ত্রুটি রয়েছে; '- dest.lon) * pi () / 180/2), 2)) এর কাছাকাছি ডান লাইন 2 এ' ডি 'থাকার কারণে নেটওয়ার্ক_পোস্টের গন্তব্য হিসাবে দূরত্ব হিসাবে আপনার মাইএসকিউএল সার্ভার সংস্করণের সাথে সামঞ্জস্যপূর্ণ ম্যানুয়ালটি পরীক্ষা করুন
ফিলিপ

হাই, @ ডিস্ট মিলসে আছে? ধন্যবাদ
জর্জে ওলাফ এরল্যান্ডসেন

1
@OlafErlandsen হ্যাঁ এটা মাইল এর
জানুয়ারী ভ্যান ডার Vegt

4

পয়েন্ট ডেটাটাইপগুলি ঠিক আছে; ল্যাট / লনের মান পেতে আপনি কেবল এক্স (কর্ড) / ওয়াই (কর্ড) করতে পারেন।

উদাহরণ স্বরূপ:

SELECT id, 
(3959 
    * acos(
        cos(radians(37)) 
        * cos(radians(Y(coord)))
        * cos(radians(X(coord)) - radians(-122)) 
        + sin(radians(37))
        * sin(radians(Y(coord)))
      )
) AS distance 
FROM markers HAVING distance < 25 
ORDER BY distance LIMIT 20;

37 ল্যাট এবং 122 দীর্ঘ হয়? এবং 25 মিটার বা কিমি?
ফিলিপ

1

কিছু স্থানাঙ্কের নিকটতম 100 রেস্তোরাঁগুলি সন্ধান করুন: http://mysql.rjweb.org/doc.php/latlng এ কার্যকর কোডটি দেখুন এটিতে "গ্রেট সিরল" দূরত্বের কম্পিউটিংয়ের জন্য একটি সঞ্চিত ফাংশন অন্তর্ভুক্ত রয়েছে।

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