[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: 10+млн записей- что быстрее:база данных или файлы?
leray
как быстрее искать нужное среди большого кол-ва записей?

к примеру,10млн имён и их описаний

1. mysql - таблица из двух полей - имя и описание

или

2. разделить имена по признаку, к примеру, по первой букве имени
и распределить все имена по папкам
в каждой папке хранится 1 файл с общей инфой обо всех именах на эту букву, при запросе в этом файле ищется нужное имя

(вариант- разделить имена по таблицам в бд не рассматривается.т.к. в моём случае понадобится 200+ таблиц для такого разделения, для бд это напряжно(?) , для файлов реально)

какой способ быстрее??
найти имя среди 10 млн записей в mysql бд или среди текстового файла из 50тыс имён?



Спустя 10 минут (12.11.2009 - 02:31) FatCat написал(а):
Проиндексировать таблицу, и будет искать быстрее.
Но и памяти потребует больше для многопользовательского режима. И добавление в проиндексированную таблицу новой записи будет в разы медленнее чем перезапись файла.

Спустя 1 час, 3 минуты, 3 секунды (12.11.2009 - 03:34) kirik написал(а):
Все зависит от потребностей. Если нужно один раз найти и забыть, то файлы пойдут, а если нужны постоянные выборки, то без вариантов - БД, причем с увеличенным размером памяти (как уже сказал FatCat). Файлы в последнем случае не вариант - постоянные операции чтения убьют диск быстро.

Спустя 4 дня, 17 часов, 24 минуты, 54 секунды (16.11.2009 - 20:59) leray написал(а):
FatCat ,kirik, спасибо

с базой данных определился, но как лучше разметить в бд записи,чтобы быстрее добавлялось и извлекалось


1 таблица и в ней 10 млн записей

или

пол сотни таблиц по 200 000 в каждой?

Спустя 12 минут, 42 секунды (16.11.2009 - 21:11) kirik написал(а):
leray
Опять же все зависит от потребностей smile.gif Но таблица может быть одна (кроме особых случаев).
Если тебе нужно вести таблицу-лог (тоесть данные будут добавляться намного чаще, чем выбираться), то создавай таблицу без индексных полей, а если будешь выбирать чаще чем добавлять, то поставь нужные индексы.
Если таблица будет постоянно изменяться, то юзай InnoDB движок, если нет - MyISAM.
Тонкостей довольно много, скажи чего делаешь, тебе подскажут советом smile.gif

Спустя 2 часа, 24 минуты, 59 секунд (16.11.2009 - 23:36) leray написал(а):
дело в том, что добававляться записи будут по несколько сотен в минуту, а выбираться по необходимости от 100 до 10 000 за раз, поэтому хочется, чтобы и записывалось быстро и выдавало шустро)

Спустя 12 минут, 14 секунд (16.11.2009 - 23:48) glock18 написал(а):
Цитата
дело в том, что добававляться записи будут по несколько сотен в минуту


определенно зависит от того, за один раз это будет делаться или нет. можно делать вставку с ключевым словом delayed, чтобы она не мешала выборкам.

опять же непонятно, из одной таблицы будут выбираться записи или из нескольких. я так понял, что их разбить планируется на несколько таблиц. впрочем, даже при выборке 10000 из 200000 с индексом быстрее будет.

Спустя 1 час, 24 минуты, 42 секунды (17.11.2009 - 01:13) leray написал(а):
я к тому, что если сравнивать время,затраченное на

выборку 10 000 из 10млн(проиндексированных) в 1 таблице
и
выборку 10 000 из 200 000 (проиндексированных) но в нескольких таблицах

каждый запрос - выборка делается конкретно из 1 таблицы

выборка из таблицы с меньшим кол-во ведь будет быстрее?

Спустя 2 минуты, 56 секунд (17.11.2009 - 01:16) glock18 написал(а):
первый вариант будет быстрее, но будет больше требоваться памяти.

Спустя 1 час, 45 минут, 32 секунды (17.11.2009 - 03:02) kirik написал(а):
Цитата (glock18 @ 16.11.2009 - 17:16)
но будет больше требоваться памяти

Если индексы нормально проставлены, то наверняка не на много больше.

Спустя 6 дней, 21 час, 2 минуты, 48 секунд (24.11.2009 - 00:04) Guest написал(а):
Цитата
10млн имён и их описаний


Представляете этот объем инфы?
минимум 1Гиг, а скорее всего больше и это без индексов!
И количество запросов!

К чему я это говорю?

А к тому, что вопрос противоречит заявленной цели.

Немного поясню, под такое количество записей и запросов вред ли "подпишеться" хот один виртуальный хостинг, нужен свой сервер! Это дорого.

Свой или доверен сервер имеют профи, а профи будет задавать такой вопрос?

Спустя 55 минут, 17 секунд (24.11.2009 - 01:00) Joker написал(а):
А почему не будет? может человек хороший программист но не когда на сталкивался с таким большим обьёмом информации, поэтому консультируется, он же спрашивает как это сделать.

Спустя 8 часов, 11 минут, 39 секунд (24.11.2009 - 09:11) glober написал(а):
Есть вероятность, что:
Цитата
человек хороший программист но не когда на сталкивался с таким большим обьёмом информации, поэтому консультируется

Меня тоже интересует тот же вопрос, что быстрее и я не специалист! И не профессиональный программист, это мое хобби!

Вот в данный момент времени занимаюсь экспериментами с MySQL и файловой системой, цель определить, что же все таки быстрее!

У меня,пока, получается, что MySQL быстрее, но только при условии индексации!
Но это при поиске инфы, при записи файл опережает БД в разы!
Я еще не закончил с экспериментами, думаю некоторые задачи будут решаться быстрее с файлами, а некоторые быстрее с БД.

Хотя уже убедился, что БД необходимая вещь! А, так же считаю, что 90% задач можно решить и без БД.

Опять же важно понимать, что такое БД! БД это некий посредник между скриптом и информацией, а информация в любом случае это файлы!!!
Так вот, над программой БД (посредника) думали много людей, причем умных, в программу БД вложены продуманные механизмы поиска и хранения информации.

Есть только одна проблемка с БД! БД универсальный инструмент, поэтому узко специализированный скрипт для работы с файлом, теоретически может быть быстрее.

Спустя 9 минут, 48 секунд (24.11.2009 - 09:21) glober написал(а):
Хотя нет!
Пока у меня файлы быстрее!
На одном только тесте, пока файлы проиграли, хотя это скорее всего не файлы а мой скрипт работы с файлами проиграл MySQL . Но это пока.

Спустя 10 минут, 8 секунд (24.11.2009 - 09:31) Chudik написал(а):
У меня есть таблица с 2,5 милионнами записей, выбирает по ней шустро, но весит она около 300 мег.

Спустя 52 минуты, 30 секунд (24.11.2009 - 10:24) sergeiss написал(а):
glober - а ты "в курсе", что много восклицательных знаков воспринимается как крик? Поэтому вопрос: и чего было так шуметь? smile.gif


Цитата (glober @ 24.11.2009 - 10:11)
Опять же важно понимать, что такое БД. БД это некий посредник между скриптом и информацией, а информация в любом случае это файлы!!!
Так вот, над программой БД (посредника) думали много людей, причем умных, в программу БД вложены продуманные механизмы поиска и хранения информации.

Ты еще забыл упомянуть про то, что и к БД, и к файлам могут обращаться одновременно разные пользователи. Как для записи, так и для чтения. И вот тут вот, как ты ни извращайся, БД тебя "сделает" smile.gif Либо ты напишешь свою БД, в которой это будет учтено.
А заодно учтешь вопросы целостности данных, и многое другое smile.gif

Так что при сравнении "БД vs файлы" учитывай не только скорость работы, но и множество других факторов.

Спустя 3 минуты, 35 секунд (24.11.2009 - 10:27) glober написал(а):
Цитата
У меня есть таблица с 2,5 милионнами записей, выбирает по ней шустро, но весит она около 300 мег.


А, конкретней? Какой запрос?
Найти одну запись или несколько соответствующих параметрам?
И сколько по времени ищет?

Вот мои данные:

1000 000 записей в БД и в файле !
Колонки:
1. id;
2. data; // Дата создания записи. <? $data=date("d.m.y"); ?>
3. time; // Время создания записи. <? $time=date("H:i:s"); ?>
4. info. // "Забито" случайное число <? $info=mt_rand(0, 100000); ?>

Причем id и info индексированные! Объем БД = 88,3 МБ !
Файл, естественно не индексированный, объем = 31,1 МБ !

Запрос такой: найти и распечатать строки в которых: (45000 < info < 45005).

Время выборки по БД = 5,1 - 5,3 сек. !
Время выборки по Файлу = 3,4 - 3,6 сек. !

И для меня это тоже странновато ! blink.gif
На счет "!!!!!!!!!!!!!!!!!!" учту biggrin.gif
А то, что без БД не обойтись, я уже говорил.

Спустя 1 час, 26 минут, 43 секунды (24.11.2009 - 11:54) sergeiss написал(а):
Цитата (glober @ 24.11.2009 - 11:27)
Время выборки по БД = 5,1 - 5,3 сек. !
Время выборки по Файлу = 3,4 - 3,6 сек. !

Код - в студию! (в т.ч. и структуру таблицы, и как созданы индексы - какими командами).
В такое время время для файла поверю, а для БД - не верю. У меня тоже есть "миллионные" таблицы, но выборка нескольких строк занимает мгновения. Потому что БД (благодаря индексам) обращается сразу к нужным записям.


Цитата (glober @ 24.11.2009 - 11:27)
На счет "!!!!!!!!!!!!!!!!!!" учту

Да-да, все уже это заметили wink.gif


Спустя 4 часа, 4 минуты, 14 секунд (24.11.2009 - 15:58) Guest написал(а):
Хорошо, код сейчас будет.
Сначала напишу маленькую, историю:
Однажды, примерно полтора года назад, задумал я сделать систему мониторинга технологического оборудования, не ради праздного любопытства, а для работы.
Тогда о PHP и MySQL я только слышал, так я и не сам хотел все это программировать. Т.к. ничего в этом не понимал. Тогда еще у меня сайт был у одной известной и уважаемой в нашем городе веб студии на хостинге. Я с этой идеей пошел к ним же. Довольно долго все это обсуждали, затем они долго думали, в конечном итоге они отказались. Одна из основных причин бала озвучена такая: типа для MySQL с которым они работают количество записей в 25 000 уже критично! Со мной беседовал их программист и объяснил, что когда количество новостей на их сайте достигло 25 000 штук, при выборке весь "сервак" на мгновение подвисал! А у меня планировалось значительно больше записей в БД.
Затем этот проект я отложил, а сейчас вообще кризис и денег на его воплощение нет.
Ради любопытства стал "ковырять" PHP и MySQL. Так, что не претендую на полную правильность моих скриптов, если будет дельный совет приму с благодарностью.

Теперь долгожданный код выборки инфы из БД:
               $res=mysql_query("select * from `jjo_test` ");

while($row=mysql_fetch_array($res))
{
$_pr=$row['info'];
if (45000 < $_pr && $_pr < 45005 ) $rez.=$row['id'].'|'.$row['date'].'|'.$row['time'].'|'.$_pr.'<br/>';
}

Таблица была создана так:
mysql_query("CREATE TABLE IF NOT EXISTS `jjo_test` (
`id` mediumint(6) NOT NULL auto_increment,
`date` char(8) NOT NULL,
`time` char(8) NOT NULL,
`info` char(8) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ;"
);

А после заполнения таблици, в PhpMyAdmin проиндексировал `info`.

Что, я сделал не так? Все это на localhost, на нормальном сервере конечно будет быстрее работать.

Спустя 5 минут, 30 секунд (24.11.2009 - 16:04) sergeiss написал(а):
Цитата (Guest @ 24.11.2009 - 16:58)
$res=mysql_query("select * from `jjo_test` ");

Да уж, это ты "чисто конкретно отжёг" laugh.gif laugh.gif laugh.gif

А теперь сделай вот такой запрос, и замерь его время (все остальное в коде, для начала, можешь оставить без изменений)
$res=mysql_query("select * from `jjo_test` where `info`>45000 and `info`<45005");


Потом, когда ты получишь доли секунды вместо секунд, я думаю, что ты и сам поймешь свою ошибку.

Спустя 39 минут, 30 секунд (24.11.2009 - 16:43) glober написал(а):
0.427 сек.
Конечно это не доли секунд но очень быстро! biggrin.gif biggrin.gif biggrin.gif
Делаем вывод: учитесь составлять правильные запросы к БД и не только.
Спасибо.

Спустя 8 минут, 11 секунд (24.11.2009 - 16:51) sergeiss написал(а):
Цитата (glober @ 24.11.2009 - 17:43)
Делаем вывод: учитесь составлять правильные запросы к БД и не только

Поздравляю! Вывод совершенно верный wink.gif

Спустя 5 дней, 16 часов, 41 минута, 12 секунд (30.11.2009 - 09:33) glober написал(а):
Привет, это вновь я.

Есть еще вопрос по скорости работы MySQL и файловой системы:
Новый тест. Беру шаблон и вставляю в него с помощью php контент.

Вариант 1. (Контент вставляю из файла.)

9,74 кб - 0,0002 - 0,0004 сек.
147 кб - 0,0004 - 0,0006 сек.

Вариант 2. (Контент вставляю из БД.)

9,74 кб - 0,0006 - 0,0015 сек.
147 кб - 0,0015 - 0,005 сек.

Другими словами, вставка контента из БД до 10 раз медленнее, чем из файла!
И, чем больше размер контента, тем заметнее разница.

При всем при этом само подключение к БД занимает от 0,0014 до 0,05 сек.
Это время не учитывалось в эксперименте, но это тоже значительно увеличивает время "извлечения" контента из БД.

Что скажете?

Спустя 1 час, 21 минута, 31 секунда (30.11.2009 - 10:54) glock18 написал(а):
Скажем, что опять неправильный тест. В первом тесте кстати, если добавить индекс на info, то выборка будет раз в 10-100 быстрее.

Сабж: конкретные данные давай.

Спустя 2 часа, 18 минут, 14 секунд (30.11.2009 - 13:12) glober написал(а):
Создаем такую вот таблицу:
mysql_query("CREATE TABLE IF NOT EXISTS `j5_content` (
`id` mediumint(6) NOT NULL auto_increment,
`link` tinytext NOT NULL,
`content` longtext NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ;"
);


Далее "отлавливаем" "линки":
if($_GET['link']) {
$link=$_GET['link'];

if (strpos($link, "html")) { /* Проверяем если в линке есть ".html" берем из файла*/

$_url='data/'.$link; /* эти файлы лежат в папке data */

$ContPages=trim(file_get_contents($_url)); /* достаем из файла, "обрезаем конци", присваеваем значение переменной */

} else { /* Иначе, если линк заканчивается на ".sql" берем из БД */

$res=mysql_query("select * from `j5_content` where link='$link'");
$row=mysql_fetch_array($res);
$ContPages=$row['content'];

}
}

/* Выводим в браузер */

echo $ContPages;


Надо заметить, что .htaccess перенаправляет все запросы на index.php, и переменной 'link' присваевает значения url.

Спустя 5 минут, 19 секунд (30.11.2009 - 13:18) glock18 написал(а):
Что ж, если для хранения всех текстов используется не один файл, а для каждой отдельный, то результат неплох. В случае с полями типа text, файлы при правильном использовании могут дать большой выигрыш. Здесь оно в принципе правильное.

Спустя 15 минут, 58 секунд (30.11.2009 - 13:34) glober написал(а):
У меня вопрос: если в некоторых случаях, типа данного, работа с файлами оказывается значительно быстрее, чем с БД, может стоит в таких случаях использовать файлы?

Я и экспериментами занялся только для того, что бы определиться с выбором файлы или БД. Теперь я думаю, что и то и другое, в зависимости от задачи.
А, что скажете ВЫ?

Спустя 6 минут, 23 секунды (30.11.2009 - 13:40) glock18 написал(а):
Цитата
Я и экспериментами занялся только для того, что бы определиться с выбором файлы или БД. Теперь я думаю, что и то и другое, в зависимости от задачи.
А, что скажете ВЫ?

именно так. выбирать одно не надо, надо использовать то, что лучше в каждом конкретном случае
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.