MySQL запрос на оптимизацию
У меня есть одна проблема MySQL. Я должен оптимизировать некоторые запросы на моем сайте. Один из них я уже сделал, но есть некоторые, которые я не могу решить без вашей помощи.
У меня есть таблица под названием "новости":
CREATE TABLE IF NOT EXISTS `news` (
`id` int(10) NOT NULL auto_increment,
`edited` smallint(1) NOT NULL default '0',
`site` varchar(30) default NULL,
`foreign_id` varchar(25) default NULL,
`title` varchar(255) NOT NULL,
`text` text NOT NULL,
`image` varchar(255) default NULL,
`horizontal` smallint(1) NOT NULL,
`image_author` varchar(255) default NULL,
`text_author` varchar(255) default NULL,
`lang` varchar(3) NOT NULL,
`link` varchar(255) NOT NULL,
`date` date NOT NULL,
`redirect` smallint(1) NOT NULL,
`parent` int(10) NOT NULL,
`views` int(5) NOT NULL,
`status` smallint(1) NOT NULL,
PRIMARY KEY (`id`),
KEY `lang` (`lang`,`status`),
KEY `date` (`date`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=47122 ;
как вы можете видеть, у меня есть два индекса: "lang" и "date"
Я пробовал несколько комбинаций разных индексов, и этот дал мне лучшие результаты... к сожалению, только на моем локальном компьютере. На сервере у меня все еще плохие результаты. Я хочу сказать, что база данных одинакова.
запрос:
SELECT id FROM news WHERE lang = 'en' AND STATUS =1 ORDER BY DATE DESC LIMIT 0, 10
localhost объяснить:
+ ---- + ------------- + ------- + ------- + -------------- - + ------ + --------- + ------ + ------ + ------------- + | id | select_type | стол | тип | возможные_ключи | ключ | key_len | ref | строки | Extra | +----+-------------+-------+-------+---------------+------+---------+------+------+-------------+ | 1 | ПРОСТО | новости | индекс | язык | дата | 3 | NULL | 23 | Используя где | + ---- + ------------- + ------- + ------- + -------------- - + ------ + --------- + ------ + ------ + ------------- +
Сервер объяснил:
+ ---- + ------------- + ------- + ------ + --------------- + -------- + --------- + ------------- + ------- + -------- --------------------- + | id | select_type | стол | тип | возможные_ключи | ключ | key_len | ref | строки | Extra | +----+-------------+-------+------+---------------+--------+---------+-------------+-------+-----------------------------+ | 1 | ПРОСТО | новости | ref | статус | статус | 13 | const,const | 15840 | Используя где; Использование сортировки файлов | + ---- + ------------- + ------- + ------ + --------------- + -------- + --------- + ------------- + ------- + -------- --------------------- +
Я посмотрел много других подобных тем, но, к сожалению, я не могу найти решение для работы на моем сервере. Я буду очень рад получить от вас какое-то решение с некоторым объяснением этого, чтобы я мог оптимизировать другие мои запросы.
Спасибо!
1 ответ
Это ваш запрос:
SELECT id
FROM news
WHERE lang = 'en' AND STATUS =1
ORDER BY DATE DESC
LIMIT 0, 10
Лучший индекс - это тот, который содержит все поля, используемые в запросе (всего четыре поля). Порядок в индексе определяется условиями равенства в where
пункт, сопровождаемый order by
пункт, за которым следуют другие столбцы в select
пункт.
Итак, попробуйте этот индекс: ndws(leng, status, date, id)
,