הערה

מציאת הערך הכי קרוב בmySQL

נניח ונתון לנו ערך מסויים, ונרצה לשלוף מהמסד נתונים שלנו את הערך הכי קרוב לערך הזה, איך נבצע זאת? הפיתרון הינו פשוט נורא לביצוע, כל שעלינו לעשות הוא לסדר את הטבלה לפי ערך חדש שנגדיר שהוא יהיה הערך האבסולוטי בין הערך בטבלה לבין הערך שנרצה למצוא את הערך הכי קרוב אליו.

נניח ונרצה למצוא את הערכים הכי קרובים ל-2500 בטבלה שלנו, אז נריץ את השאילתא הבאה:

SELECT number, ABS( number - 2500 ) AS distance
FROM numbers
ORDER BY distance
LIMIT 6

הבעיה בשאילתא הזו היא שברגע שנשתמש בטבלה טיפה גדולה, אז הביצועים יפגעו משמעותית. מה שאפשר לעשות כדי לשפר את הביצועים זה להגביל את הנתונים בצורה כזו:

SELECT number, ABS( number - 2500 ) AS distance FROM (
    (
        SELECT number
        FROM `numbers`
        WHERE number >=2500
        ORDER BY number
        LIMIT 6
    ) UNION ALL (
        SELECT number
        FROM `numbers`
        WHERE number < 2500
        ORDER BY number DESC
        LIMIT 6
    )
) AS n
ORDER BY distance
LIMIT 6

מה שהפונקציה UNION עושה זה פשוט חיבור של תוצאות של שני שאילתות בשאילתא אחת. מה שזה נותן לנו הוא שאנחנו קודם כל לוקחים את כל התוצאות שמעל המספר שאנחנו מחפשים ומתחתיו, ואז רק על התוצאות האלו אנחנו מפעילים את החישוב של הסידור, ובצורה כזו גם את הטבלה מכילה עשרות אלפי רשומות, בתאכלס החישובים הכבדים יתבצעו רק על 12 תוצאות.

כתיבת תגובה

האימייל לא יוצג באתר. (*) שדות חובה מסומנים

תגי HTML מותרים: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>