LINUX.ORG.RU
Форум — Talks  

[Няшный велосипед][MySQL] Что медленней: запрос к сотне простых, или одной сложной таблице?

 


0

0
Вступление. Опять горят сроки и опять мозг выключается - требует сон. SQL воспринимать он тоже отказывается, потому я максимально упростил задачу, и имею около шести сотен простых(13x40) табличек. Столь простых, что выбрать парочку true из каждой - мелочь для самописного скрипта.

Вопрос: какая из СУБД быстрее работает с мелкими таблицами? Достаточными будут чтение и запись в определённую ячейку, сортировка и поиск по простым условиям желательны.

Также, буду благодарен за сравнения скорости сего велосипеда(правда, уже не в состоянии думать) со скоростью обработки парочки сложных и больших таблиц MySQL и PostgreSQL.

//Единовременно нужно обслуживать 1-3 пользователей. На серваке 2 четырёхядерных Оптерона.

На мелких таблицах вроде старый mysql 3.23 всех рвал. Думаю, 5-ка будет не намного хуже.
ef37 ★★
()
конечная эффективность зависит от того что ты потом будешь с результатами выборки делать. и, вполне может быть, что сложный запрос (с последующей обработкой результатов) порвет по эффективности кучку мелких но с навороченной логикой в обработке результатов выборки. естессно - все это для получения одного и того же результата.
isden ★★★★★
()
Ответ на: комментарий от isden
В случае со всеми(~480) таблицами - нужно лишь проверить истинно или ложно значение единственной ячейки определённого столбца. Истина будет примерно в 1/4 случаев, только совпавшие таблицы придётся перечитывать.

Руки тянутся написать это на плюсах... Хочется верить что мускуль будет много быстрее :)

wyldrodney ☆
() автор топика
Ответ на: комментарий от boombick
Это желательно ;) Но если выбирать между "неудобно + всего за несколько миллисекунд" и "удобно + всего за пару секунд", я выберу второе.
wyldrodney ☆
() автор топика
>Единовременно нужно обслуживать 1-3 пользователей. На серваке 2 четырёхядерных Оптерона.

В этих условиях - хоть в файлах хранить и в цикле искомое значение искать. Оптимизацией нужно заниматься, когда у тебя хотя бы сотня запросов в секунду идёт, серьёзной оптимизацией - когда 1000 в секунду :)
KRoN73 ★★★★★
()
Ответ на: комментарий от brn
|target|pass 1|pass 2|pass 3|pass 4|pass 5|pass 6|pass 7|pass 8|pass 9|pass 10|res|
------------------------------------------------------------------------------- --------------------
| 1 |true |true |false |false |false |false |false |true |false |false |true|
| 2 |true |true |false |false |false |false |false |true |false |true |
| 3 |true |true |true |true |false |true |false |true |true |true |
| 4 |true |true |true |false |true |false |true |true |false |true |
| 5 |true |true |false |false |false |false |false |true |false |false |
...
|result|true |true |false |false |false |false |false |false |false |false |


В последнем столбце логическое умножение(значений первых столбцов), если не изменяет память. Суть в том, что для сокращения времени я вынес искомое в отдельный столбец(обновляется при редком редактировании таблицы).

Вот примерно таких таблиц у меня наберётся с пол тысячи. Нужно найти таблицы с false в res, и вернуть их идентификаторы. Дальше - проще: проверить значение в строке result(последняя) определённого столбца и вернуть номера строк, содержащих false.
wyldrodney ☆
() автор топика
Ответ на: комментарий от KRoN73
Это прекрасно! Это открывает путь новому велосипеду :) Шучу, конечно... Будет быстро работать на мускуле - перенесу на sqlite для настольной версии.
wyldrodney ☆
() автор топика
Ответ на: комментарий от wyldrodney
Реализация с огромным количеством SQL запросов вида "SELECT `pass 7` FROM myTable WHERE target=3" будет работать гораздо медленнее чем через собственную наколенную неSQL базу данных, которая сделана специально для таких простых выборок.
eugene2k ★
()
Не доконца понятны начальные условия.
Если шесть сотен табличек завязаны реляциями, то жопа. Проверка тригерами целосности сцылок сожрет все. Лучше одну но Б О Л Ь Ш У Ю.
vada ★★★★★
()
Ответ на: комментарий от eugene2k
>Реализация с огромным количеством SQL запросов вида "SELECT `pass 7` FROM myTable WHERE target=3" будет работать гораздо медленнее чем через собственную наколенную неSQL базу данных, которая сделана специально для таких простых выборок.

Приятель оказался столь реактивным, что часть софтины уже работает :) Скоро узнаем о скорости.

Будет тормозить, подумаю как это написать самому. SQL отложен в сторону, потому идей по объединению этого ужаса в одну таблицу нет - слишком много малосвязанных параметров.

С другой стороны, если верить Крону, тормозов я не замечу.

wyldrodney ☆
() автор топика
> имею около шести сотен простых(13x40) табличек

Ужас. Придется вам брать частные уроки баз данных. Дорого.

Nastishka ★★★★★
()
Ответ на: комментарий от Nastishka
Не придётся, приятель, не придётся. Я на этом только заработаю.

Не, я не планирую заниматься БД в будущем.

wyldrodney ☆
() автор топика
Ответ на: комментарий от wyldrodney
>Вот примерно таких таблиц у меня наберётся с пол тысячи. Нужно найти таблицы с false в res, и вернуть их идентификаторы. Дальше - проще: проверить значение в строке result(последняя) определённого столбца и вернуть номера строк, содержащих false.

Построй вьюверы и не парься.
vada ★★★★★
()

У тебя такая структура БД, что аж просит, чтобы ее нормализовали. Особенно pass 1 ... pass 10 пахнут за версту.

shimon ★★★★★
()

Запомните, ребята, такое: MySQL, когда у него реляции между сложносоставленными таблицами в количестве больше трех (навскидку), или когда строчки для результата очень длинные сами по себе (например, 30 полей типа TEXT или что-то в этом роде), превращается в тыкву. И RDBMS из него тогда такой же, как и из тыквы.

shimon ★★★★★
()
Ответ на: комментарий от shimon
Не знаю как. Может завтра, если в лоб не удастся решить, возьмусь за документацию. http://www.mysql.ru/docs/gruber/ показалось слишком нудным, хотя и довольно понятно. Но нужно проспаться :)
wyldrodney ☆
() автор топика
Ответ на: комментарий от wyldrodney
Типа, да. Если у тебя таблицы редко обновляются, то вьювер будет меняться тож редко, хоть и тормозно, но получить из него нужную инфу быстро.

Вобщем, в школу НАДО ходить :)
vada ★★★★★
()
Ответ на: комментарий от vada
Тогда ты будешь писать более грамотно на русском )))

Да, неплохо бы изучить. Но сроки поджимают. Раз нагрузка почти никакая, я могу себе позволить сделать это максимально простым и приспособенным для расширения способом. Хоть это и медленно(вопрос, кстати). Ещё даже не знаю что понадобится через неделю.

wyldrodney ☆
() автор топика
Ответ на: комментарий от wyldrodney
Если я правильно понял исходные требования, то твои 600 таблиц легко превращаются в три: две - словари target(int) и pass(int), 3-я - их пересечение targ_x_pass(int,int) без всяких bool.
Attila ★★
()
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.