簡體   English   中英

為什么索引在 mysql 中不能按預期工作?

[英]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_usedis_deleted列過濾post表。

= 1測試特定值1 ,而IS TRUE對任何非零值都為真。 我猜它決定了當您搜索特定值時,首先過濾post表會更有效,因為匹配項可能會更少(因為這些列沒有被索引,所以它不知道01是唯一的值)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM