mysql מיון אוטומטי על עמודה שהיא חלק מ UNIQUE
-
תופעה מוזרה שנתקלתי
יש לי טבלה כזוCREATE TABLE `Rooms` ( `id` int NOT NULL AUTO_INCREMENT, `ProjectID` int NOT NULL, `num` tinyint NOT NULL, `Type` tinyint(1) NOT NULL, `ActiveInTheSystem` tinyint(1) NOT NULL, `note` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL, `ReleaseTime` int NOT NULL, `FirstEntryTime` int NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `ProjectID` (`ProjectID`,`num`) ) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
והכנסתי אליו נתונים על פי ProjectID כאשר מספר החדר בעמודה num מעורבב.
ניתן לראות כאשר אני שולף את כל הטבלה אני מקבל תוצאה על פי סדר הid שהוא מיספור אוטומטי
כאשר שאני שולף ללא סינון ניתן לראות שאני מקבל תוצאות על פי סדר הכנסתם והעמודה num הינה ממוינתSELECT * FROM `Rooms`
ולעומת זאת על שאילתה
SELECT * FROM `Rooms` WHERE `ProjectID`='7'
זה מגיע ממוין לפי הnum ולא לפי הid
איך זה ניהיה? תמיד ידעתי שבmysql אין כלל מיון אוטומטי אלא הוא שולף כסדר ההכנסה, ובעמודה id ניתן לראות בבירור שסדר ההכנסה היה בצורה אחרת ממה שהוא שולף?
אולי זה קשור לכך שיש UNIQUE על עמודות ProjectID ו num?UNIQUE KEY `ProjectID` (`ProjectID`,`num`)
מעניין
-
@חוקר אמר בmysql מיון אוטומטי על עמודה בשם num:
אלא הוא שולף כסדר ההכנסה
תיקון: כאשר אתה לא מבקש סדר, אי אפשר לסמוך בשום צורה על שום סדר ידוע מראש.
מותר ל-MySQL לעשות מה שבא לו, בפועל בד"כ הוא יעשה מה שהכי נוח לו. (ייתכן שזה יהיה סדר ההכנסה)אולי זה קשור לכך שיש UNIQUE על עמודות ProjectID ו num?
כן לגמרי סביר,
כאשר אתה מסנן על פיProjectID
הרבה יותר זול לבדוק באינדקס מאשר לעבור על כל הטבלה, בתוך האינדקס הערכים מסודרים לפיProjectID
ואז לפיnum
כך שברירת מחדל הם יצאו בדיוק בסדר שבו הם נמצאים באינדקס. -
@חוקר אני לא מספיק מנוסה ב- MySQL, אבל נתקלתי בתפעה באקסס ונראה לי שגם ב-SQLServer.
ההסבר שלי הוא כך: כאשר עמודה מוגדרת כאינדקס ה-DB ממיין אותה לצורך יעילות חיפוש. ובשאילתת בחירה זה יגרום לפעמים למיון על פי עמודה זו, למרות שלפי הכללים סדר התוצאות לא מוגדר בשאילתא סתמית ללא מיון,
יתכן כי ה-DB ממין גם עמודות המוגדרות כ-UNIQUE. (זה הגיוני לצורך יעילות הבדיקה בהכנסת ערך חדש)
כל זה כתבתי מסברא, אשמח לאישוש או הפרכה מהמומחים כאן. -
@OdedDvir אמר בmysql מיון אוטומטי על עמודה בשם num:
אשמח לאישוש או הפרכה מהמומחים כאן
אני לא מומחה אבל...
ה-DB ממיין אותה לצורך יעילות חיפוש
כלומר, הערכים עצמם לא ממויינים אבל ה-DB מייצר "אינדקס" (מפתח ענינים, ספר טלפונים, או איך שלא תרצה לקרוא לזה).
האינדקס תמיד ממויין.למרות שלפי הכללים סדר התוצאות לא מוגדר בשאילתא סתמית ללא מיון
סדר לא מוגדר לא מחייב שזה לא יצא לפי שום סדר, רק שאי אפשר לסמוך על סדר מסויים
יתכן כי ה-DB ממין גם עמודות המוגדרות כ-UNIQUE. (זה הגיוני לצורך יעילות הבדיקה בהכנסת ערך חדש)
עד כמה שאני יודע, UNIQUE תמיד ייצר אינדקס מהטעם שכתבת
-
@yossiz אמר בmysql מיון אוטומטי על עמודה בשם num:
כלומר, הערכים עצמם לא ממויינים אבל ה-DB מייצר "אינדקס" (מפתח ענינים, ספר טלפונים, או איך שלא תרצה לקרוא לזה). האינדקס תמיד ממויין.
סדר לא מוגדר לא מחייב שזה לא יצא לפי שום סדר, רק שאי אפשר לסמוך על סדר מסויים
לזה נתכוונתי, תודה על הניסוח המדויק!