[英]why does index not work as expected in mysql?
我真的很想知道為什么我的索引不起作用。
我有兩個表帖子,post_log。
create table post
(
id int auto_increment
primary key,
comment int null,
is_used tinyint(1) default 1 not null,
is_deleted tinyint(1) default 0 not null
);
create table post_log
(
id int auto_increment
primary key,
post_id int not null,
created_at datetime not null,
user int null,
constraint post_log_post_id_fk
foreign key (post_id) references post (id)
);
create index post_log_created_at_index
on post_log (created_at);
當我在下面查詢時, created_at 索引運行良好。
explain
SELECT *
FROM post p
INNER JOIN post_log pl ON p.id = pl.post_id
WHERE pl.created_at > DATE('2022-06-01')
AND pl.created_at < DATE('2022-06-08')
AND p.is_used is TRUE
AND p.is_deleted is FALSE;
當我在下面查詢時,它不起作用並且發布表進行全掃描。
explain
SELECT *
FROM post p
INNER JOIN post_log pl ON p.id = pl.post_id
WHERE pl.created_at > DATE('2022-06-01')
AND pl.created_at < DATE('2022-06-08')
AND p.is_used = 1
AND p.is_deleted = 0;
下面也不起作用。
explain
SELECT *
FROM post p
INNER JOIN post_log pl ON p.id = pl.post_id
WHERE pl.created_at > DATE('2022-06-01')
AND pl.created_at < DATE('2022-06-08')
and p.comment = 111
'tinyint = 1' 和 'tinyint is true' 有什么不同?
而且,為什么第一個查詢正常工作而其他查詢不能正常工作?
在制定查詢計划時,MySQL 必須決定是先使用索引過濾post_log
表,還是先使用is_used
和is_deleted
列過濾post
表。
= 1
測試特定值1
,而IS TRUE
對任何非零值都為真。 我猜它決定了當您搜索特定值時,首先過濾post
表會更有效,因為匹配項可能會更少(因為這些列沒有被索引,所以它不知道0
和1
是唯一的值)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.