Не равно запрос так медленно - PullRequest
1 голос
/ 17 марта 2020

У меня такой запрос:

SELECT * , (
( 1584392725 ) - ( suprayts.time )
) AS timeDiff
FROM (
`suprayts`
)

WHERE  `suprayts`.`is_deleted` = '0'
AND `suprayts`.`is_approved` =1
AND `suprayts`.`username` != 'rayben1'
AND `suprayts`.`time` >1584306325
ORDER BY `suprayts`.`is_boosted_by_user` DESC , `suprayts`.`id` ASC
LIMIT 10

Этот запрос выполняется очень медленно (в среднем 0,2 секунды), если я удаляю следующую строку:

AND `suprayts`.`username` != 'rayben1'

Он выполняется в 10 раз быстрее , (в среднем 0,02 с). Как я могу ускорить этот запрос?

Мои индексы:

enter image description here

Объясните:

enter image description here

Мой стол:

CREATE TABLE IF NOT EXISTS `suprayts` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(15) CHARACTER SET utf8 NOT NULL,
  `question` varchar(70) COLLATE utf8mb4_unicode_ci NOT NULL,
  `suprayt_photo` varchar(50) CHARACTER SET utf8 NOT NULL,
  `time` int(11) NOT NULL,
  `endTime` int(11) NOT NULL,
  `datetext` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `like_count` int(10) unsigned NOT NULL DEFAULT '0',
  `dislike_count` int(10) unsigned NOT NULL DEFAULT '0',
  `is_approved` bit(1) NOT NULL DEFAULT b'0',
  `is_deleted` enum('1','0') CHARACTER SET utf8 NOT NULL DEFAULT '0',
  `is_end_notification_sent` bit(1) NOT NULL DEFAULT b'0',
  `open_vote` enum('0','1') CHARACTER SET utf8 NOT NULL DEFAULT '1',
  `boost` int(11) NOT NULL DEFAULT '0',
  `is_boosted_by_user` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `username_3` (`username`,`suprayt_photo`),
  KEY `id` (`id`,`time`,`is_approved`,`is_deleted`),
  KEY `username` (`username`,`is_deleted`),
  KEY `username_2` (`username`,`datetext`),
  KEY `id_2` (`id`,`username`,`time`,`is_approved`,`is_deleted`),
  KEY `username_4` (`username`,`time`,`is_approved`,`is_deleted`),
  KEY `ix1` (`id`,`time`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci AUTO_INCREMENT=130789 ;

Ответы [ 2 ]

0 голосов
/ 18 марта 2020

В зависимости от прекомпилятора SQL, если он используется, или от самого SQL, возможно, он чувствителен к порядку запроса "where", который не находится в порядке ключей БД и не использует индекс и вместо этого делать последовательное сканирование? Просто, чтобы исключить возможность, попробуйте поместить элементы WHERE в порядок ключей индекса БД.

0 голосов
/ 17 марта 2020

ИСПОЛЬЗОВАТЬ НЕ СУЩЕСТВУЕТ

SELECT * , (
( 1584392725 ) - ( suprayts.time )
) AS timeDiff
FROM (
`suprayts`
)

WHERE  `suprayts`.`is_deleted` = '0'
AND `suprayts`.`is_approved` =1
AND NOT EXISTS (
   SELECT x.no FROM (SELECT 1 AS no) x WHERE `suprayts`.`username` = 'rayben1'
)
AND `suprayts`.`time` >1584306325
ORDER BY `suprayts`.`is_boosted_by_user` DESC , `suprayts`.`id` ASC
LIMIT 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...