Огромные базы данных

12 3
D
На сайте с 05.06.2007
Offline
155
2438

Есть большая база данных, более миллиона записей. Средняя длинна записи 1кб. (база 1 гб)

Почти все запросы происходят по примари ID, но иногда и поиск по всем ячейкам, включая текстовые.

Теперь вопрос, как заставить эту базу не тормазить? :D

Сейчас всё работает на mysql5, сам он вроде как оптимизирован.

Посоветуйте как всё это оптимизировать, запросов много, сервер несправляется.

Какие оптимальные данные сервера должны быть, какую базу лучше использовать, что если один сервер(даже если очень мощный) не справляется, какие могут быть решения?

Всем спасибо за любые ответы!

Написал не мало шедевров ;)
DA
На сайте с 04.02.2005
Offline
165
#1

попробуйте загнать всю базу в оперативку

тыщ-пыщ
P
На сайте с 08.03.2007
Offline
250
#2

полнотекстовый поиск использовать, использовать postgres вместо mysql - в 8.3 версии появилась оптимизация для случая последовательного просмотра больших таблиц.

K
На сайте с 24.03.2004
Offline
223
#3
Dimanych:
Посоветуйте как всё это оптимизировать, запросов много, сервер несправляется.
Какие оптимальные данные сервера должны быть, какую базу лучше использовать, что если один сервер(даже если очень мощный) не справляется, какие могут быть решения?

Закиньте my.cnf в топик почитать... может в нем причина.

ps. Какая ОС?

проверенная ддос защита (http://ddos-protection.ru) -> http://ddos-protection.ru (http://ddos-protection.ru), бесплатный тест, цена от размера атаки не зависит.
Слава Шевцов
На сайте с 23.07.2005
Offline
370
#4
Dimanych:
Есть большая база данных, более миллиона записей. Средняя длинна записи 1кб. (база 1 гб)
Почти все запросы происходят по примари ID, но иногда и поиск по всем ячейкам, включая текстовые.
Теперь вопрос, как заставить эту базу не тормазить?

Примеры типичных запросов приведите, пожалуйста. И примерную структуру таблиц. Судя по описанному, что-то не так с самой базой. Надо понять, что. Подозреваю классическую сортировку с сохранением промежуточной таблицы на диск из-за наличия text-полей в извлекаемых данных.

Неизменность точки зрения неизменно порождает иллюзию понимания.
P
На сайте с 08.03.2007
Offline
250
#5

http://people.freebsd.org/~kris/scaling/dfly.html , хотя это скорее всего не очень подходит? Зато FreeBSD есть повод поставить.

B
На сайте с 20.02.2008
Offline
3
#6
Dimanych:
Есть большая база данных, более миллиона записей. Средняя длинна записи 1кб. (база 1 гб)
Почти все запросы происходят по примари ID, но иногда и поиск по всем ячейкам, включая текстовые.
Теперь вопрос, как заставить эту базу не тормазить? :D

Сейчас всё работает на mysql5, сам он вроде как оптимизирован.
Посоветуйте как всё это оптимизировать, запросов много, сервер несправляется.
Какие оптимальные данные сервера должны быть, какую базу лучше использовать, что если один сервер(даже если очень мощный) не справляется, какие могут быть решения?

Всем спасибо за любые ответы!

попробуйте: http://www.tizag.com/mysqlTutorial/mysql-index.php

если БД обновляется не часто, то это хорошо ускоряет

но вы уверены, что БД тормозит? алгоритм поиска какой используете? может там поиск по штамму или аж морфология. Или просто алгоритм работает не эфективно. При большом кол-ве одновременных запросов дело может быть не столько в БД, сколько в используемом интерпретаторе, но это философия.

ну и комплекс мероприятий тут: http://www.mysql.ru/docs/man/MySQL_Optimisation.html

Репетиторов и преподавателей нет! (http://www.repetitorov.net)
D
На сайте с 05.06.2007
Offline
155
#7

Спасибо за ответы! Есть пища для размышления)

Насчёт поиска по текстовым полям, впринцепи этих запросов не мало)

Привожу пример таблички и запрос на поиск.. впринцепи это обычная база пользоватей и поиск по ней.

OS Linux Suse

CREATE TABLE IF NOT EXISTS `tb_users` (

`id` int(10) NOT NULL auto_increment,

`email` varchar(100) NOT NULL default '',

`pass` varchar(13) NOT NULL default '',

`sess` varchar(32) NOT NULL default '',

`expire` tinyint(1) NOT NULL default '0',

`last_visit` int(10) NOT NULL default '0',

`last_ip` varchar(15) NOT NULL default '',

`ok` tinyint(1) NOT NULL default '0',

`foto` int(10) NOT NULL default '0',

`name` varchar(30) NOT NULL default '',

`lastname` varchar(30) NOT NULL default '',

`mw` int(1) NOT NULL default '0',

`born` bigint(10) NOT NULL default '0',

`state` int(1) NOT NULL default '0',

`country` int(3) NOT NULL default '0',

`city` varchar(30) NOT NULL default '',

`text` text NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;

select * from `tb_users`where 1 and name LIKE '%тест%' and lastname LIKE '%тест%' and mw='1' and born<'826498800' and state='2' and country='20'

my.cnf скину позже..

Слава Шевцов
На сайте с 23.07.2005
Offline
370
#8

Dimanych, плохо написан запрос. У программиста кривые руки. Запрос лучше переписать (думаю, другие тоже):

select * from `tb_users` where and name = 'тест' and lastname = 'тест' and mw='1' and born<'826498800' and state='2' and country='20'

если возможен запрос по неполному имени, то

select * from `tb_users` where name LIKE 'тест%' and lastname LIKE 'тест%' and mw='1' and born<'826498800' and state='2' and country='20'

будет намного быстрее + можно отстроить индексы.

P
На сайте с 08.03.2007
Offline
250
#9
Dimanych:
select * from `tb_users`where 1 and name LIKE '%тест%' and lastname LIKE '%тест%' and mw='1' and born<'826498800' and state='2' and country='20'

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

antono
На сайте с 12.07.2004
Offline
285
#10

Судя по структуре индексов конечно нет, только один, да и тот не используется в запросе а автоматически нумерует записи. Поставьте индексы на

mw

born

state

country

на name и lastname тоже, но тип индекса зависит то того, как нужно по ним искать будет

12 3

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий