Проблема с большой базой данных MYSQL - PullRequest
2 голосов
/ 12 июля 2011

Я сейчас программирую проект с бизнес-базой данных более 20 миллионов записей.Это структура таблицы:

CREATE TABLE IF NOT EXISTS `business` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`rdate` datetime NOT NULL,
`valid` int(1) NOT NULL,
`visible` int(1) NOT NULL,
`lockItem` int(1) NOT NULL,
`parent` int(10) NOT NULL,
`titleENG` varchar(254) COLLATE utf8_bin NOT NULL,
`address` varchar(254) COLLATE utf8_bin NOT NULL,
`city` varchar(254) COLLATE utf8_bin NOT NULL,
`state` varchar(254) COLLATE utf8_bin NOT NULL,
`zipCode` varchar(254) COLLATE utf8_bin NOT NULL,
`country` varchar(254) COLLATE utf8_bin NOT NULL,
`webAddress` varchar(254) COLLATE utf8_bin NOT NULL,
`phone` varchar(254) COLLATE utf8_bin NOT NULL,
`fax` varchar(254) COLLATE utf8_bin NOT NULL,
`contact_name` varchar(254) COLLATE utf8_bin NOT NULL,
`contact_title` varchar(254) COLLATE utf8_bin NOT NULL,
`contact_gender` enum('','male','female') COLLATE utf8_bin NOT NULL,
`company_employee` varchar(254) COLLATE utf8_bin NOT NULL,
`text` text COLLATE utf8_bin NOT NULL,
`bigPic` varchar(254) COLLATE utf8_bin NOT NULL,
`keywords` varchar(254) COLLATE utf8_bin NOT NULL,
`lowerTitle` varchar(256) COLLATE utf8_bin NOT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `id` (`id`),
 KEY `visible` (`visible`),
 KEY `parent` (`parent`),
 KEY `valid` (`valid`),
 KEY `titleENG` (`titleENG`),
 KEY `state` (`state`),
 KEY `country` (`country`),
 KEY `city` (`city`),
 KEY `keywords` (`keywords`),
 FULLTEXT KEY `titleENG_2` (`titleENG`),
 FULLTEXT KEY `lowerTitle` (`lowerTitle`),
 FULLTEXT KEY `phone` (`phone`),
 FULLTEXT KEY `city_2` (`city`),
 FULLTEXT KEY `state_2` (`state`),
 FULLTEXT KEY `business_search` (`lowerTitle`,`phone`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=12409005 ;

Некоторые из моих запросов, которые я делаю через полный текст, задаются вопросом, могу ли я использовать через LIKE и использовать функции lower () и т.д. ', но с высокой скоростью.1005 * Может кто-нибудь дать мне несколько советов?

Ответы [ 2 ]

0 голосов
/ 12 июля 2011
  • Вам не нужен INDEX для идентификатора, поскольку у вас уже есть один
  • MyISAM быстрее с char-s, чем с varchar-s
  • Если вы не используете binсортировка, вам не нужно ниже ().Используйте сортировку без учета регистра, если она вам действительно не нужна
  • Проверьте ваши запросы и индексы.Может быть, составные индексы в нескольких столбцах будут работать лучше, чем отдельные индексы (и каждый индекс замедляет запись)
  • Каково ваше соотношение записи / чтения?Если у вас много вставок / обновлений, вам нужно минимизировать количество индексов, а также рассмотреть возможность перехода на InnoDB
  • . Разгрузить полнотекстовый поиск в Sphinx, Solr или любой сторонней поисковой системе (или сборке).полнотекстовый индекс самостоятельно)
  • видимый индекс кажется ненужным - значение равно 0 или 1, и это означает, что индекс не эффективен, и я уверен, что у вас нет запроса, который фильтрует только по 'видимый '
0 голосов
/ 12 июля 2011

Все, что вам нужно сделать, это изменить параметры сортировки для нужных столбцов.Например:

ALTER TABLE `business` CHANGE COLUMN `city` `city` VARCHAR(150) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL;

Тогда вы можете использовать тот же полнотекстовый поиск.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...