鍍金池/ 問答/數(shù)據(jù)庫/ SQL 語句 NOT IN 和 != 如何優(yōu)化?

SQL 語句 NOT IN 和 != 如何優(yōu)化?

這條 sql 語句查詢的是同一張表,但是帶有 not in 和 != 索引用不上,如何優(yōu)化?

SELECT * FROM filemail.bottles WHERE id NOT IN(8,7) AND userid != 34790331 AND show_times <= 10 AND status = 1 ORDER BY reply_rate DESC, reward DESC

表結(jié)構(gòu):

CREATE TABLE `bottles` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userid` int(11) NOT NULL DEFAULT '0' COMMENT '發(fā)送者userid',
  `content` mediumtext COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '漂流瓶內(nèi)容',
  `reward` int(11) NOT NULL DEFAULT '0' COMMENT '打賞金額',
  `show_times` int(11) NOT NULL DEFAULT '0' COMMENT '曝光次數(shù)',
  `reply_times` int(11) NOT NULL DEFAULT '0' COMMENT '回應(yīng)次數(shù)',
  `reply_rate` decimal(4,2) NOT NULL DEFAULT '0.00' COMMENT '回復(fù)率(回復(fù)數(shù)/展現(xiàn)量)',
  `location` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '位置',
  `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '狀態(tài) 0 無效 1有效',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_of_userid` (`userid`)
) ENGINE=InnoDB AUTO_INCREMENT=152 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
回答
編輯回答
傻丟丟

not in 可以換成id > 8 ... union all ... id < 7
!= 也可以這樣換,不過沒看到你給userid加索引
或許可以用with優(yōu)化,mysql不熟,
postgresql可以用explain analyse分析,共同學(xué)習(xí)吧

共同學(xué)習(xí)為什么要踩一下?不明白

explain analyse SELECT * FROM filemail.bottles WHERE id>8 AND userid != 34790331 AND show_times <= 10 AND status = 1
UNION ALL
SELECT * FROM filemail.bottles WHERE id<7 AND userid != 34790331 AND show_times <= 10 AND status = 1
ORDER BY reply_rate DESC, reward DESC
這樣id的索引可以使用

QUERY PLAN
Index Scan using bottles_pkey on bottles (cost=0.29..117.04 rows=9
Index Cond: (id < 1000)
Total runtime: 0.352 ms

EXPLAIN

2018年9月15日 04:34