בעיות עם MYSQL5

fatNjazzy

New member
בעיות עם MYSQL5

היי יש לי טבלה שבכל יום מקבלת 5-10 אלף רשומות חדשות. כרגע יש 400 אלף ומן הסתם זה ילך ויגדל. יש לי דוח שמבצע מכפלה של הטבלה כפול 4 ולוקח לדו"ח לרוץ כ 20-25 שניות. הדו"ח עבר אופטימיזציה ע"י DBA יש לי VIEW על הטבלה בעבור הדו"ח הספציפי הזה שחוסך אולי 3 שניות. הטבל הזו תגיע לכמה מליונום תוך זמן לא רב, ה STORAGE ENGINE שלי הוא INNODB מה עושים? אולי לשקול ORACLE? איך אני מייעל את הסיפור הזה? תודה
 

itaym02

New member
הםםם-א. אוראקל קנו את - innoDB אז אין מה לעבו

ב. myisam אמור להיות יותר מהיר (השאלה אם האפליקציה שלך דורשת טראנזאקציות וFK) ג. פרט חשוב שלא ציינת-מהי המכונה (הברזלים) ד. אני מניח שהשאילתה מורכבת מתת שאילתות - יתכן שניתן לשמור חלקן בcach כ memory.
 

fatNjazzy

New member
אז ככה,

ב. מה היעילות של MYISAM מול INNODB, כלומר זה מה שיעשה את ההבדל או שמצפה לי פה שינוי של 2-5% ביעילות? ג. מדובר בשרת LINUX עם 4GB זכרון ומעבד DUAL 3.2. ד. השיאלתה מבצעת מכפלה של עצמה כפול 3 פעמים. אשמח להסבר. תודה רבה
 

itaym02

New member
ב. האתר של mysql יתן לך יותר מידע ממני-אך הדר

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

fatNjazzy

New member
הנה המבנה והקוד

הקוד ליצירת הטבלה
CREATE TABLE `bank_account_status` ( `id` int(11) NOT NULL auto_increment, `log_import_id` int(11) NOT NULL default '0', `account` varchar(50) NOT NULL default '', `status_date` char(8) NOT NULL default '00000000', `account_currency` char(3) NOT NULL default '', `balance` double NOT NULL default '0', `open_positions_fx` double NOT NULL default '0', `open_positions_otc` double NOT NULL default '0', `open_positions_stock` double NOT NULL default '0', `open_positions_cfd` double NOT NULL default '0', `open_positions_stock_option` double NOT NULL default '0', `open_positions_futures` double NOT NULL default '0', `open_positions_contract_option` double NOT NULL default '0', `open_positions_managed_fund` double NOT NULL default '0', `open_positions_bonds` double NOT NULL default '0', `reserved_for_future_instrument2` double NOT NULL default '0', `reserved_for_future_instrument3` double NOT NULL default '0', `reserved_for_future_instrument4` double NOT NULL default '0', `total_equity` double NOT NULL default '0', `margin` double NOT NULL default '0', `net_equity_for_trading` double NOT NULL default '0', `partner_account_key` int(11) NOT NULL default '0', PRIMARY KEY (`id`), UNIQUE KEY `bank_account_status_u002` (`account`,`status_date`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=403934 ;​
הנה ה VIEW שמוצא את היום הראשון בחודש ואת היום האחרון בחודש לכל לקוח. צפייה בשלושים התוצאות הראשונות של ה VIEW לוקחת 7-9 שניות תודה רבה....
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v_bank_account_status` AS select `bank_account_status`.`account` AS `account`,`bank_account_status`.`balance` AS `balance`,min(`bank_account_status`.`status_date`) AS `status_date` from `bank_account_status` group by `bank_account_status`.`account`,month(`bank_account_status`.`status_date`) union select `bank_account_status`.`account` AS `account`,`bank_account_status`.`balance` AS `balance`,max(`bank_account_status`.`status_date`) AS `status_date` from `bank_account_status` group by `bank_account_status`.`account`,month(`bank_account_status`.`status_date`)$$​
 

itaym02

New member
תחליף את `bank_account_status`.`account`

ל`bank_account_status`.`id` ותראה מה השיפור בזמנים. על ID יש clustered index.
 

shanor

New member
מממ...

כדאי לבדוק האם הוספה של אינדקס לaccounts. בנוסף, כדאי לבדוק מול explain לראות באילו שדות יש שימוש באילו לא, אולי יש עוד אינדקסים שכדאי להוסיף....
 
למעלה