|
|
|
| Имеется таблица, представляющая собой базу файлов. Структура несложная:
CREATE TABLE `files` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(100) NOT NULL default '', -- имя файла
`path` varchar(250) NOT NULL default '', -- путь к нему на сервере
`size` varchar(30) NOT NULL default '0', -- размер в байтах
`last_modify` varchar(50) NOT NULL default '0', -- дата изменнеия; берется из ответа ftp-сервера, поэтому тип varchar
`ip` varchar(16) NOT NULL default '', -- ip сервера
PRIMARY KEY (`id`),
FULLTEXT KEY `name` (`name`,`path`),
FULLTEXT KEY `path` (`path`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
|
Как видно, есть полнотекстовый поиск по имени и пути. Так вот вопрос. Поскольку записей в таблице будет порядка сотни тысяч, встает пробема ускорения работы. Что можно с этой таблицей сделать? Может, ее тип поменять? Или отдельных полей? Или OPTIMIZE TABLE делать после каждого обновления? | |
|
|
|
|
|
|
|
для: Киналь
(14.03.2007 в 20:30)
| | А какие запросы будут обращаться к таблице и какой примерно прогнозируемый объём таблицы? | |
|
|
|
|
|
|
|
для: cheops
(14.03.2007 в 22:35)
| | Запрос, в основном, один - поисковый. То есть
mysql_query("SELECT *, MATCH (path, name) AGAINST('$q* $trans_q*' IN BOOLEAN MODE) AS score
FROM files
WHERE
name REGEXP '[a-zA-Zа-яА-Я0-9]+\.(".$exts.")$' AND -- фильтр по расширению файла
MATCH (path, name) AGAINST('$q* $trans_q*' IN BOOLEAN MODE)
ORDER BY score LIMIT $start_item, $end_item -- постраничная навигация
");
|
По объему - только что уточненные данные=) В таблице будет как минимум 150 000 записей, сама таблица весить будет примерно 40 Мб. | |
|
|
|
|
|
|
|
для: Киналь
(14.03.2007 в 22:47)
| | Не понятно, почему поиск смешанный, т.е. зачем используется REGEXP и зачем одиночный индекс
FULLTEXT KEY `path` (`path`)
|
или имеется ещё один поисковый запрос? В принципе, если избавитесь от REGEXP - всё должно работать гораздо быстрее. Если ускорения не будет можно будет разбить таблицу на несколько (К сожалению, на уровне MySQL сегментирования таблицы можно будет проводить только в MySQL 5.1, а она ещё в бета и не скоро до серверов дойдёт). | |
|
|
|
|
|
|
|
для: cheops
(14.03.2007 в 22:59)
| | Поиск смешанный для того, чтобы найденное имя файла (поле `name`) проверить на расширение, т.е. на соответствие регулярному выражению. А одиночный индекс - проглядел, каюсь; в phpMyAdmin'е не туда ткнул)
Но общий вывод ясен: на уровне mySQL особо ничего не сделать. Попробую еще со скриптами поколдовать.
Спасибо! | |
|
|
|