к примеру,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 в каждой?
с базой данных определился, но как лучше разметить в бд записи,чтобы быстрее добавлялось и извлекалось
1 таблица и в ней 10 млн записей
или
пол сотни таблиц по 200 000 в каждой?
Спустя 12 минут, 42 секунды (16.11.2009 - 21:11) kirik написал(а):
leray
Опять же все зависит от потребностей Но таблица может быть одна (кроме особых случаев).
Если тебе нужно вести таблицу-лог (тоесть данные будут добавляться намного чаще, чем выбираться), то создавай таблицу без индексных полей, а если будешь выбирать чаще чем добавлять, то поставь нужные индексы.
Если таблица будет постоянно изменяться, то юзай InnoDB движок, если нет - MyISAM.
Тонкостей довольно много, скажи чего делаешь, тебе подскажут советом
Опять же все зависит от потребностей Но таблица может быть одна (кроме особых случаев).
Если тебе нужно вести таблицу-лог (тоесть данные будут добавляться намного чаще, чем выбираться), то создавай таблицу без индексных полей, а если будешь выбирать чаще чем добавлять, то поставь нужные индексы.
Если таблица будет постоянно изменяться, то юзай InnoDB движок, если нет - MyISAM.
Тонкостей довольно много, скажи чего делаешь, тебе подскажут советом
Спустя 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 таблицы
выборка из таблицы с меньшим кол-во ведь будет быстрее?
выборку 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 . Но это пока.
Пока у меня файлы быстрее!
На одном только тесте, пока файлы проиграли, хотя это скорее всего не файлы а мой скрипт работы с файлами проиграл MySQL . Но это пока.
Спустя 10 минут, 8 секунд (24.11.2009 - 09:31) Chudik написал(а):
У меня есть таблица с 2,5 милионнами записей, выбирает по ней шустро, но весит она около 300 мег.
Спустя 52 минуты, 30 секунд (24.11.2009 - 10:24) sergeiss написал(а):
glober - а ты "в курсе", что много восклицательных знаков воспринимается как крик? Поэтому вопрос: и чего было так шуметь?
Цитата (glober @ 24.11.2009 - 10:11) |
Опять же важно понимать, что такое БД. БД это некий посредник между скриптом и информацией, а информация в любом случае это файлы!!! Так вот, над программой БД (посредника) думали много людей, причем умных, в программу БД вложены продуманные механизмы поиска и хранения информации. |
Ты еще забыл упомянуть про то, что и к БД, и к файлам могут обращаться одновременно разные пользователи. Как для записи, так и для чтения. И вот тут вот, как ты ни извращайся, БД тебя "сделает" Либо ты напишешь свою БД, в которой это будет учтено.
А заодно учтешь вопросы целостности данных, и многое другое
Так что при сравнении "БД 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 сек. !
И для меня это тоже странновато !
На счет "!!!!!!!!!!!!!!!!!!" учту
А то, что без БД не обойтись, я уже говорил.
Спустя 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) |
На счет "!!!!!!!!!!!!!!!!!!" учту |
Да-да, все уже это заметили
Спустя 4 часа, 4 минуты, 14 секунд (24.11.2009 - 15:58) Guest написал(а):
Хорошо, код сейчас будет.
Сначала напишу маленькую, историю:
Однажды, примерно полтора года назад, задумал я сделать систему мониторинга технологического оборудования, не ради праздного любопытства, а для работы.
Тогда о PHP и MySQL я только слышал, так я и не сам хотел все это программировать. Т.к. ничего в этом не понимал. Тогда еще у меня сайт был у одной известной и уважаемой в нашем городе веб студии на хостинге. Я с этой идеей пошел к ним же. Довольно долго все это обсуждали, затем они долго думали, в конечном итоге они отказались. Одна из основных причин бала озвучена такая: типа для MySQL с которым они работают количество записей в 25 000 уже критично! Со мной беседовал их программист и объяснил, что когда количество новостей на их сайте достигло 25 000 штук, при выборке весь "сервак" на мгновение подвисал! А у меня планировалось значительно больше записей в БД.
Затем этот проект я отложил, а сейчас вообще кризис и денег на его воплощение нет.
Ради любопытства стал "ковырять" PHP и MySQL. Так, что не претендую на полную правильность моих скриптов, если будет дельный совет приму с благодарностью.
Теперь долгожданный код выборки инфы из БД:
Таблица была создана так:
А после заполнения таблици, в PhpMyAdmin проиндексировал `info`.
Что, я сделал не так? Все это на localhost, на нормальном сервере конечно будет быстрее работать.
Сначала напишу маленькую, историю:
Однажды, примерно полтора года назад, задумал я сделать систему мониторинга технологического оборудования, не ради праздного любопытства, а для работы.
Тогда о 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` "); |
Да уж, это ты "чисто конкретно отжёг"
А теперь сделай вот такой запрос, и замерь его время (все остальное в коде, для начала, можешь оставить без изменений)
$res=mysql_query("select * from `jjo_test` where `info`>45000 and `info`<45005");
Потом, когда ты получишь доли секунды вместо секунд, я думаю, что ты и сам поймешь свою ошибку.
Спустя 39 минут, 30 секунд (24.11.2009 - 16:43) glober написал(а):
0.427 сек.
Конечно это не доли секунд но очень быстро!
Делаем вывод: учитесь составлять правильные запросы к БД и не только.
Спасибо.
Конечно это не доли секунд но очень быстро!
Делаем вывод: учитесь составлять правильные запросы к БД и не только.
Спасибо.
Спустя 8 минут, 11 секунд (24.11.2009 - 16:51) sergeiss написал(а):
Цитата (glober @ 24.11.2009 - 17:43) |
Делаем вывод: учитесь составлять правильные запросы к БД и не только |
Поздравляю! Вывод совершенно верный
Спустя 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 сек.
Это время не учитывалось в эксперименте, но это тоже значительно увеличивает время "извлечения" контента из БД.
Что скажете?
Есть еще вопрос по скорости работы 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 написал(а):
Создаем такую вот таблицу:
Далее "отлавливаем" "линки":
Надо заметить, что .htaccess перенаправляет все запросы на index.php, и переменной 'link' присваевает значения url.
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 написал(а):
Цитата |
Я и экспериментами занялся только для того, что бы определиться с выбором файлы или БД. Теперь я думаю, что и то и другое, в зависимости от задачи. А, что скажете ВЫ? |
именно так. выбирать одно не надо, надо использовать то, что лучше в каждом конкретном случае