[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Эксперименты с MySQL
slim12
Добрый день.

Короче столкнулся я, с проектом, в котором предполагается довольно большой объем данных, которые будут храниться в БД. Ну и нагрузку на БД назвать маленькой тоже нельзя.

Раньше с такими объемами не сталкивался. Решил провести эксперимент перед началом работы. Создал тестовую табличку, в которую добавил 2000000 записей.

Структура таблицы:

id name price
1 Nokia 1000

После этого начал играться с запросами. И все оказалось очень печально sad.gif

Запрос вида:
SQL
SELECT * FROM `test` style='color:green'>LIMIT 0, 30


Выполняеться 0.7 с.

А вот такой запросец

SELECT * FROM `test` WHERE name LIKE 'Nok%' LIMIT 0 , 30

Уже выполняеться около 1 c.

Тестировал конечно на локальной тачке Винда+ Денвер+MySQL 4. В связи с эти, хотел получить советы опытных мира сего:

1) Какой количество записей для таблицы MySQL в среднем является критическим (запросы работают очень медленно, база падает)
2) Стоит ли останавливаться на MySQL или стоит рассмотреть другие варианты, как более быстрые и надежные
3)Ну и собственно самый интересующий меня вопрос: почему всего с 2000000 записей в таблице, запросы исполняются так долго (а что будет когда пользователей будет около 500 одновременно на сайте). Это из за винды с Денвером? Хотелось бы услышать ответ в какую сторону копать.

Всем спасибо.



Спустя 7 минут, 57 секунд (13.07.2009 - 11:56) sergeiss написал(а):
А вот теперь посчитай. У тебя 2 миллиона записей. Объем каждой 8+10+8 байт (в предположении, что первая и последняя колонка - целые числа, а имя - 10 байт).
Итого - 28*2 = 56 миллионов байт, ~54.5 мегабайта.

Это я подсчитал размер врЕменной таблицы, куда были выбраны твои данные. Как ты считаешь, указанное тобой время 1 секунда - это нормально для перезаписи 54.5 МБ из одного файла в другой?

Выводы:
1. Нефиг юзерам позволять делать такие объемные выборки smile.gif Надо выбирать только то, что действительно необходимо. Нужные колонки, нужные строки.
2. Да и "индексы рулят". Они существенно сокращают время выборки, когда используется ORDER BY, либо любые условия в WHERE.

Спустя 42 минуты, 52 секунды (13.07.2009 - 12:39) FatCat написал(а):
Цитата (sergeiss @ 13.07.2009 - 12:56)
54.5 мегабайта.

Собственно, есть 2 физических факторов торможения баз данных.
Первый фактор связан с объемом данных в оперативной памяти.
На таблицах в несколько десятков мегабайт он оказывается решающим.
Второй фактор связан с файловой системой компьютера. Таблица - это файл; индекс - это еще один файл. На ноутбуке критическим порогом размера файла является 50-70 Мб. Если размер файла таблицы или индекса больше, начинает лавинообразно расти время дерганий головки винчестера по кластерам. На машинах с быстрыми винчестерами порог начинается с 200-250 Мб.

Посмотри большие форумы: не случайно везде поотключали полнотекстовый поиск: индекс слишком велик, никакими конфигурациями сервера не потянуть. На движках типа phpBB2, в которых не предусмотрен полнотекстовый поиск, а лишь LIKE, поиск приходится отрубать еще раньше: когда сама таблица дорастет до критического размера.

Спустя 1 час, 40 минут, 22 секунды (13.07.2009 - 14:20) Nikitian написал(а):
Что-то не могу представить когда требуется запрос вида
SQL
select * from table where field like "str%"

В чём проблема хранить яйца отдельно, колбасу отдельно? В одной таблице товары с id-производителя, в другой производители. Поиск по таблице производителей будет очень быстрым даже если юзать like, т.к. их всего-то сотня максимум.
Изучайте связанные запросы или ваш проект будет падать от каждой сотни посетителей (

Так же очень рекомендую почаще использовать explain

Спустя 5 часов, 13 минут, 17 секунд (13.07.2009 - 19:33) slim12 написал(а):
Цитата (FatCat @ 13.07.2009 - 09:39)
Цитата (sergeiss @ 13.07.2009 - 12:56)
54.5 мегабайта.


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

Ну проблема как раз в этом и заключается, что это будет система поиска информации.

Табличка которую я привел в примере тестовая. Естественно в реальном проекте производители, товары, категории в разных таблицах связанные по id.

А вот без поиска по названию и описанию товара не обойтись вообще никак, потому, что это и есть основная идея проекта. Это не один интернет магазин в котором 500-2000 товаров. Это около 1000 магазинов с довольно широким асортиментом. В будущем количество магазинов будет расти.

Спустя 4 минуты, 6 секунд (13.07.2009 - 19:37) sergeiss написал(а):
Цитата (slim12 @ 13.07.2009 - 20:33)
что это будет система поиска информации

Так это будет система ПОИСКА информации или система ВЫБОРА информации? Я потому спрашиваю, что как-то весьма смутно представляю, для чего при поиске понадобится выбирать сразу 2 млн. записей. Всё равно ни одному юзеру столько не надо. Он просто не в состоянии будет даже заголовки прочитать, не говоря уж о содержании.
Да и при выборе тоже столько не нужно. Так что надо изначально продумать оптимальный алгоритм поиска, чтобы выбирать как можно меньше данных, только то, что нужно. И ни байтом больше!

Спустя 1 час, 21 минута, 5 секунд (13.07.2009 - 20:58) Nikitian написал(а):
Разбивайте таблицы. Например, если у вас поиск идёт по первым символам, то сделайте подобие индекса по первым 1, 2, 3, 4, 5, и т.д. символам. Отдельные таблички под каждое количество символов. Индекс можете делать числовой, например crc32() от этих символов. Так и выбирайте - получится быстро, но табличек много.

Спустя 16 часов, 48 минут, 21 секунда (14.07.2009 - 13:47) slim12 написал(а):
Цитата (sergeiss @ 13.07.2009 - 16:37)
Цитата (slim12 @ 13.07.2009 - 20:33)
что это будет система поиска информации

Так это будет система ПОИСКА информации или система ВЫБОРА информации? Я потому спрашиваю, что как-то весьма смутно представляю, для чего при поиске понадобится выбирать сразу 2 млн. записей. Всё равно ни одному юзеру столько не надо. Он просто не в состоянии будет даже заголовки прочитать, не говоря уж о содержании.
Да и при выборе тоже столько не нужно. Так что надо изначально продумать оптимальный алгоритм поиска, чтобы выбирать как можно меньше данных, только то, что нужно. И ни байтом больше!

Это будет система поиска. Естественно, что 2 млн записей выбираться не будут. Я не совсем правильно поставил вопрос изначально.

Будет что то на подобии поисковой системы по интернет магазинам, которые регистрируются и указывают свою xml с товарами. Из xml товары попадают в базу и участвуют в поиске. Ну вот для этого всего добра надо будет сделать систему поиска.

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

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

Волнует скорость выполнения таких запросов и нагрузка на сервер, потому что посещаемость планируется не маленькая.

Я пока даже не буду поднимать вопрос "нечеткого поиска". Когда при вводе пользователем "Nokia 5100", "Nokia5100", "5100 Nokia Xpress Music" должны вываливаться одни и те же товары. Так же пока не учитываю алгоритма отсекания стоп слов: "купить дешево ", "купить в Москве" и.т.д. Все это не просто, и пока реализовываться не будет.

Сейчас хочется четко определиться с вопросами:

1) Стоит ли использовать MySQL для этого проекта? Не будет ли падать таблицы БД при больших объемах записей от 1000000 примерно до 10000000?

2) При грамотном проектировании БД и оптимизации запросов, будут ли они выполняться в разумных временных пределах и насколько при этом будут нагружать сервер?

P.S. Я понимаю, что вопрос очень абстрактный. Все зависит от многих факторов. Хочу просто узнать у людей разрабатывающих крупные посещаемые проекты, о приделах MySQL. Просто не раз видел в интернете материалы по поводу того, что критическим размером таблицы для MySQL является 100-150 Мб. Мол при объемах больше запросы работают очень медленно и сервер не выдерживает нагрузки.

Спустя 14 минут, 49 секунд (14.07.2009 - 14:01) Nikitian написал(а):
Мускуль - не такой слабый, как об этом пишут те, кто не умеет его готовить smile.gif
Не замечал тормозов при работе с таблицами по 2гб (поисковый индекс phpbb).
Цитата

1) Стоит ли использовать MySQL для этого проекта? Не будет ли падать таблицы БД при больших объемах записей от 1000000 примерно до 10000000?

2) При грамотном проектировании БД и оптимизации запросов, будут ли они выполняться в разумных временных пределах и насколько при этом будут нагружать сервер?

1) На ваше усмотрение. 10000000 записей не говорят о том, что все они будут постоянно участвовать в выборках.
2) Будут

Чтобы не делать очень сложные запросы, могу посоветовать денормализовать таблицы введя избыточные данные. Этим вы снизите нагрузку пожертвовав некоторой частью дискового пространства.
Не забывайте о кэшировании. Мускуль хоть и умеет кэшировать, но вот для этого всё-равно необходимо устанавливать с ним соединение, а пул коннектов не безграничен.

Пока не увидел ни одного запроса (даже схематичного), чтобы сказать, будет он нагружать ваш сервер бд до изнеможения или нет. В идеальном случае сферического сервера в вакууме - не будет нагружать.

Спустя 4 минуты, 25 секунд (14.07.2009 - 14:06) glock18 написал(а):
1. собственно, почему бы нет. падать не будет. разве что каждая запись будет весит по 1мб... sergeiss приведет кучу доводов за postgresql, но и на mysql такие базы делают.

2. при грамотном - все будет быстро smile.gif

касательно PS. очевидно, все или почти все сервера баз данных не будут быстро работать с таблицами в 100-150 мб, и mysql здесь не исключение. естественно, это касается выборки с использованием временных таблиц. если временные таблицы не нужны, то и из такой таблицы выборка будет достаточно быстрая.

если таблица, по которой делается поиск, имеет много полей, советую вынести поля не относящиеся к поиску в отдельную таблицу. так ты понизишь размер таблицы, и размер записей => выборка будет значительно быстрее и при большом размере таблицы.

Спустя 5 минут, 32 секунды (14.07.2009 - 14:11) sergeiss написал(а):
Я бы посоветовал посмотреть в сторону PostgreSQL.
Да, MySQL используется во многих проектах и достаточно мощный... Но у Постгре даже типы данных и специальные команды, оптимизированные для текстового поиска. И не только это - есть и другие преимущества.

Оптимизировать же можно любую БД, было бы желание, и понимание возможностей этой БД.


PS. Не успел я написать, а меня уже "посчитали" smile.gif

Спустя 2 часа, 58 минут, 30 секунд (14.07.2009 - 17:10) slim12 написал(а):
Ок. Спасибо всем кто отозвался.

Быстрый ответ:

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