Клубове Дир.бг
powered by diri.bg
търси в Клубове diri.bg Разширено търсене

Вход
Име
Парола

Клубове
Dir.bg
Взаимопомощ
Горещи теми
Компютри и Интернет
Контакти
Култура и изкуство
Мнения
Наука
Политика, Свят
Спорт
Техника
Градове
Религия и мистика
Фен клубове
Хоби, Развлечения
Общества
Я, архивите са живи
Клубове Дирене Регистрация Кой е тук Въпроси Списък Купувам / Продавам 17:00 08.06.24 
Компютри и Интернет
   >> Бази данни
Всички теми Следваща тема *Кратък преглед

Страници по тази тема: 1 | 2 | >> (покажи всички)
Тема MySQL и локване на таблици при сложна SQL заявканови  
АвторЦ++ (Нерегистриран)
Публикувано17.05.06 15:52



здравейте, забелязал съм следния проблем с локване на таблиците в MySQL.

за да не навлизам в подробности и същностите в моя случай ще опиша с един бърз пример, при който релацията е същата:

например: имаме отдели, служители и инвентар (да речем). релациите са 1 към много навсякъде (т.е. служител има отдел-ИД, инвентар има служител-ИД)

ако пусна следната SQL заявка, която да извади инвентара от даден отдел (т.е. принадлежащ на служителите в даден отдел) ще имаме следното:

select inventory.* from inventory
left join employee on inventory.employee_id=employee.employee_id
where employee.department_id=123

това търсещо в JOIN-натата таблица по поле установих че заключва таблиците (поне в MySQL 3.xx). Става въпрос за случаите когато таблицата invenotory е вече със стотици хиляди редове (тогава се забелязва) особено ако почнат повече юзъри да ръчкат по справката.

а в този момент в inventory и employee (в примера, който съм дал) не може да се прави нищо (insert/update/delete/etc).

решението е ясно за мен - в случая с примера - слагам department_id и в invenotory и малко тъпичко, но иначе заявката върви без да локва таблиците (така става само върху една таблица).

някой да може да даде съвет в такива случаи как е по-правилно да се процедира и по принцип, дали така разрешението е ОК, или да се търси чрез друг вид SQL заявки да се заобиколи ?



Тема Re: MySQL и локване на таблици при сложна SQL заявка [re: Ц++]  
Авторmysql (Нерегистриран)
Публикувано17.05.06 16:16



аз съм детенце, което чете от книжки и там пише, че така прави при myisam таблици. твоите такива ли са?



Тема Re: MySQL и локване на таблици при сложна SQL заявнови [re: mysql]  
АвторЦ++ (Нерегистриран)
Публикувано17.05.06 17:27



баш такива ;) съшите.

а какви таблици да използвам тогава. аз си обичам и предпочитам MyISAM таблиците. а и какви са тези книжки, които четеш ?



Тема Re: MySQL и локване на таблици при сложна SQL заявнови [re: Ц++]  
Автор Dakota (erotoman)
Публикувано17.05.06 19:17



Ако можеш мини на MySQL 5 и използвай таблици от тип InnoDB, вместо MyISAM - така ще имаш възможност да заключваш поредово, а не цялата таблица, което в твоя случай ще реши проблема.

Everything louder than everything else...


Тема Re: MySQL и локване на таблици при сложна SQL заявнови [re: Dakota]  
АвторЦ++ (Нерегистриран)
Публикувано17.05.06 19:54



мога. но ще е голямо приключение да мигрирам всичко на MySQL 5.

иначе когато едно време тествах с InnoDB забелязах че таблиците стават значително по-големи по размер.

така или иначе съм намерил едно решение, а ми хрумна и второ евентуално ... та ще си остана на MySQL 3.



Тема Re: Само да попитам ..нови [re: Ц++]  
Автор salle (един такъв)
Публикувано17.05.06 21:16



Какъв е смисъла от тази заявка, че нещо ми убягва

select inventory.* from inventory
left join employee on inventory.employee_id=employee.employee_id
where employee.department_id=123

За какво точно ти е LEFT JOIN в случая, че нещо не сващам?

А иначе браво за откритието! Нарича се "топла вода" т.е. това дето MyISAM винаги заключва цялата таблица. Пише го не само в книгите ами дори и в такива простички неща като ръководството на MySQL



Тема Re: MySQL и локване на таблици при сложна SQL заявнови [re: Ц++]  
АвторПeнчo (Нерегистриран)
Публикувано17.05.06 23:04



Може да струва усилия, но мисля че си струва (минаването на 5-та версия). Ще имаш допълнителни удобства, а и рано или късно ще преминеш някой ден. Защо да не е по-навреме? MySQL v3 си е ретро-дърво, влез малко от малко в пътя :)
И докато "мигрираш" ще ти препоръчам покрай другите мизерии да минеш на UTF-8.



Тема Re: MySQL и локване на таблици при сложна SQL заявнови [re: Пeнчo]  
АвторДядoMpaз (Нерегистриран)
Публикувано18.05.06 11:53



Като цяло миграция към InnoDB е най доброто което можеш да направиш. Не е нужно да мигрираш цялата база ако те притеснява размера на базата. Можеш да мигрираш само част от таблиците - ALTER TABLE <table_name> TYPE=INNODB; При големи таблици това може да отнеме доста време така че ако ще го правиш на production сървър по добре си създай нова таблица INNODB и копирай данните в нея на групи от по 1000-2000, че да избегнеш locks.

Ако не ти се занимава с ugrade на първо място обаче мисля че е добре да пробваш да оптимизираш заявките и да пипнеш малко индексите на таблиците и настройките на MySQL. Дори и при няколко милиона записа няма да имаш проблем да вадиш данните който ти трябват без да имаш проблеми с locks.
1. Сложи индекси на полетата по който търсиш - в случая ти трябват индекси на inventory.employee_id и employee.department_id . Пусни EXPLAIN за да видиш какви индекси използват заявките
2. MySQL сам си оптимизира заявките но за аз лично тази заявка бих я написал като

select inventory.* from employee
left join inventory on inventory.employee_id=employee.employee_id
where employee.department_id=123

Така или иначе първо се прави търсенето в employee и после вадиш записите от inventory

3. Поразгледай малко настройките на MySQL - има няколко книги на Jeremy Zawodny за оптимизация. Ако можеш вдигни размера на
key_buffer_size, read_buffer_size, read_rnd_buffer_size, sort_buffer_size като внимавай да не изполваш повече памет отколкото имаш. Идеалния вариант е размера на key_buffer_size да е колкото размера на всички индекс (MYI) файлове



Тема Re: Само да попитам ..нови [re: salle]  
АвторЦ++ (Нерегистриран)
Публикувано18.05.06 14:44



select inventory.* from inventory
left join employee on inventory.employee_id=employee.employee_id
where employee.department_id=123

е всъщност

select inventory.* from inventory
where inventory.employee_id=employee.employee_id and employee.department_id=123

в онлайн документациите пише, че MySQL сам си преобразува LEFT JOIN в WHERE клауза.

аз обаче съм свикнал да си ги записвам с LEFT JOIN.

за повече инфо:



сега надявам се не греша, че разлика реално няма от гледна точка на изпълнение от страна на MySQL и на двете заявки ? или греша ?



Тема Re: MySQL и локване на таблици при сложна SQL заявнови [re: ДядoMpaз]  
АвторЦ++ (Нерегистриран)
Публикувано18.05.06 15:01



мерси много за съветите, ще погледна настройките.
колкото до InnoDB таблиците въпроса е малко принципен, че съм свикнал с MyISAM, но явно ще трябва да си надвия над ината и да седна да поекспериментирам с InnoDB (ще се наложи май да преправя някои полета и т.н. че по-инерция му давам VARCHAR винаги 255 в MyISAM).

иначе примерната заявка която ми даде (с разменените места) я пуснах върху тестова таблица само с 415 реда (в примера налогията с inventory). и ми върна 424 (9 реда в повече с всичките полета NULL, NULL, NULL и т.н.)

но както и да е. мерси много за останалите съвети с настройките, ще седна да попрочета нещо по въпроса и да тествам, че това са опции, за които нищичко не знам, а така като гледам ще ми е доста интересно да понауча повече.




Страници по тази тема: 1 | 2 | >> (покажи всички)
Всички темиСледваща тема*Кратък преглед
Клуб :  


Clubs.dir.bg е форум за дискусии. Dir.bg не носи отговорност за съдържанието и достоверността на публикуваните в дискусиите материали.

Никаква част от съдържанието на тази страница не може да бъде репродуцирана, записвана или предавана под каквато и да е форма или по какъвто и да е повод без писменото съгласие на Dir.bg
За Забележки, коментари и предложения ползвайте формата за Обратна връзка | Мобилна версия | Потребителско споразумение
© 2006-2024 Dir.bg Всички права запазени.