Добрый день. В БД мееются следующие таблицы :
CREATE TABLE IF NOT EXISTS p_s
(
id INT(10) NOT NULL AUTO_INCREMENT,
name VARCHAR(100) NOT NULL
INDEX p_s_id (id),
) ENGINE=INNODB CHARACTER SET utf8;
CREATE TABLE IF NOT EXISTS t_i
(
id INT(10) NOT NULL AUTO_INCREMENT,
name VARCHAR(100) NOT NULL
INDEX t_i_id (id),
) ENGINE=INNODB CHARACTER SET utf8;
CREATE TABLE IF NOT EXISTS synonyms_p_s
(
p_s_id INT(10) NOT NULL,
t_i_id INT(10) NOT NULL,
synonym_ VARCHAR(100) NOT NULL,
INDEX synonym_synonyms_p_s (synonym_),
CONSTRAINT pkId_p_s_synonyms_p_s FOREIGN KEY (p_s_id) REFERENCES p_s (id) ON DELETE CASCADE,
CONSTRAINT pkId_t_i_synonyms_p_s FOREIGN KEY (t_i_id) REFERENCES t_i (id) ON DELETE CASCADE
) ENGINE=INNODB CHARACTER SET utf8;
В таблице "synonyms_p_s" около 500 000 записей.
Задача : сделать максимально быструю выборку из таблицы "synonyms_p_s", чтобы делать подбор в поле, подобно как здесь :
http://maps.2gis.ru/ в полях подбора.
1) Пробовал сделать выборку хранимой процедурой, с запросом :
CREATE PROCEDURE `sp_P_s_on_synonym`(IN `var_synonym_` VARCHAR(10)) /* сюда приходит строка поиска вроде '%про%' */
BEGIN
SELECT DISTINCT
s.p_s_id AS p_s_id,
s.synonym_ AS p_s_synonym
FROM
synonyms_p_s AS s
WHERE
s.synonym_ LIKE var_synonym_
LIMIT 10;
END
медленно получается, около двух секунд ожидания (не подходит для построения списка выбора подобранных значений)
2) Подумал о таблице MEMORY - отказался от этой мысли, всвязи с большим размером таблицы и ее даже не получается создать (The table 'tab4' is full)
3) Проблему могло было решить партицирование таблицы "synonyms_p_s", но по полю с типом VARCHAR этого вроде не сделать.
Незнаю куда двигаться, подскажите пожалуйста как можно это сделать. Заранее благодарен за ответ