У меня есть миллионная таблица строк с множеством специфических запросов, которые все замедляют. Каждый запрос должен выполняться при каждом клике, который делает пользователь.
В настоящее время я сохраняю результаты моих интенсивных запросов в $ _SESSION. Просто потому, что кеш MySQL удаляется после нескольких разных запросов.
Можно ли как-то постоянно хранить повторяющиеся запросы лучше, чем $ _SESSION? Даже после того, как пользователь 1 сделал запрос, а позже пользователь 2 делает тот же самый повторяющийся запрос даже через несколько дней (?)?
Таблица едва получает новые записи .. как … когда-либо. Так что это в основном таблица для 99,99% чтения, а не записи.
SHOW CREATE TABLE
CREATE TABLE `campaign__companies` (
`id` int(21) NOT NULL AUTO_INCREMENT,
`business_id` varchar(25) NOT NULL DEFAULT '',
`name` varchar(255) NOT NULL DEFAULT '',
`form_id` int(5) NOT NULL DEFAULT '-1',
`spec_ids` int(6) DEFAULT '0',
`spec_path` varchar(100) NOT NULL DEFAULT '0',
`country_id` int(5) NOT NULL,
`region_id` int(5) DEFAULT NULL,
`city_id` int(5) DEFAULT NULL,
`code_id` int(5) DEFAULT NULL,
`profile_url` varchar(255) NOT NULL DEFAULT '',
`has_email` varchar(100) DEFAULT NULL,
`email_price` float NOT NULL DEFAULT '0',
`has_phone` varchar(255) DEFAULT NULL,
`phone_price` float NOT NULL DEFAULT '0',
`is_active` int(2) NOT NULL DEFAULT '0',
`active` int(1) NOT NULL DEFAULT '1',
`failed_request` int(2) NOT NULL DEFAULT '0',
`failed_captcha` int(2) NOT NULL DEFAULT '0',
`date_added` int(21) NOT NULL DEFAULT '0',
`date_registered` int(21) NOT NULL DEFAULT '0',
`date_checked_pre` int(21) NOT NULL DEFAULT '0',
`date_checked_captcha` int(21) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `country_id` (`country_id`),
KEY `has_email` (`has_email`),
KEY `has_phone` (`has_phone`),
KEY `spec_ids` (`spec_ids`),
KEY `country_region` (`country_id`,`region_id`),
KEY `country_region_city` (`country_id`,`region_id`,`city_id`),
KEY `country_region_city_code`
(`country_id`,`region_id`,`city_id`,`code_id`),
KEY `spec_path` (`spec_path`)
) ENGINE=InnoDB AUTO_INCREMENT=950047 DEFAULT CHARSET=utf8
Если увеличение размера кэша запросов не возможно, вы можете рассмотреть что-то вроде Memcache или аналогичные варианты (Redis!). Это позволяет записывать значения на сервер кэширования и получать их очень быстро. Поскольку вы используете PHP, вы обнаружите, что у него очень простой API: просто укажите его на сервере memcache (который может быть той же машиной, что и ваш сервер MySQL, если необходимо), затем прочитайте и запишите ключ / значения.
Примечание: memcache также не является постоянным, но это, безусловно, хорошо для более длительного срока.
Других решений пока нет …