Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: ускорение работы с таблицей
 
 автор: Киналь   (14.03.2007 в 20:30)   письмо автору
 
 

Имеется таблица, представляющая собой базу файлов. Структура несложная:

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 делать после каждого обновления?

   
 
 автор: cheops   (14.03.2007 в 22:35)   письмо автору
 
   для: Киналь   (14.03.2007 в 20:30)
 

А какие запросы будут обращаться к таблице и какой примерно прогнозируемый объём таблицы?

   
 
 автор: Киналь   (14.03.2007 в 22:47)   письмо автору
 
   для: 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 Мб.

   
 
 автор: cheops   (14.03.2007 в 22:59)   письмо автору
 
   для: Киналь   (14.03.2007 в 22:47)
 

Не понятно, почему поиск смешанный, т.е. зачем используется REGEXP и зачем одиночный индекс
 FULLTEXT KEY `path` (`path`)

или имеется ещё один поисковый запрос? В принципе, если избавитесь от REGEXP - всё должно работать гораздо быстрее. Если ускорения не будет можно будет разбить таблицу на несколько (К сожалению, на уровне MySQL сегментирования таблицы можно будет проводить только в MySQL 5.1, а она ещё в бета и не скоро до серверов дойдёт).

   
 
 автор: Киналь   (14.03.2007 в 23:12)   письмо автору
 
   для: cheops   (14.03.2007 в 22:59)
 

Поиск смешанный для того, чтобы найденное имя файла (поле `name`) проверить на расширение, т.е. на соответствие регулярному выражению. А одиночный индекс - проглядел, каюсь; в phpMyAdmin'е не туда ткнул)
Но общий вывод ясен: на уровне mySQL особо ничего не сделать. Попробую еще со скриптами поколдовать.

Спасибо!

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования