|
Страници по тази тема: 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 | >> (покажи всички)
|
|
|