gpt4 book ai didi

Mysql不使用索引

转载 作者:行者123 更新时间:2023-11-29 07:07:26 25 4
gpt4 key购买 nike

我尝试在我的表上创建索引。但首先mysql使用它然后不使用索引。

这是我的表索引。 enter image description here

我的查询。

EXPLAIN SELECT
COUNT(DISTINCT K.bayiid) AS toplam,
SUM(K.tutar) AS yatirilan,
SUM(IF(K.durum='2', K.tutar*K.toplam,0)) AS kazanc,
SUM(IF(K.durum='-1', K.tutar, 0)) AS kayip,
SUM(IF(K.durum='1', K.tutar,0)) AS devam,
SUM(IF(K.durum='0', K.tutar,0)) AS iptal,
SUM(1) AS oynanan,
SUM(IF(K.durum='2', 1,0)) AS kazanan,
SUM(IF(K.durum='-1', 1,0)) AS kaybeden,
SUM(IF(K.durum='1', 1,0)) AS devameden,
SUM(IF(K.durum='0', 1,0)) AS iptalolan,
U.*
FROM kuponlar AS K
INNER JOIN users AS U ON U.id = K.bayiid AND U.durum != '4' AND U.id = '26689'
WHERE K.durum < 3 AND K.tarih >= '2016-12-01 00:00:00' AND K.tarih <= '2016-12-31 23:59:59'

查询说明 enter image description here

但我不想使用 USE INDEX 或 FORCE INDEX。你知道为什么 mysql 工作不稳定吗?

最佳答案

 ON U.id = K.bayiid 
AND U.durum != '4'
AND U.id = '26689'

为了清楚起见,将最后 2 部分移至 WHERE;仅保留定义 JOIN 的条件。

WHERE K.durum < 3 
AND K.tarih >= '2016-12-01 00:00:00'
AND K.tarih <= '2016-12-31 23:59:59'

建议:对于日期范围,请执行以下操作:

  AND K.tarih >= '2016-12-01'
AND K.tarih < '2016-12-01' + INTERVAL 1 MONTH

对于K,有

INDEX(bayiid, darum)
INDEX(bayiid, tarih)

(在不知道数据分布的情况下,我无法预测哪个更好。优化器会选择。)

如果您想进一步讨论此问题,请为每个表提供SHOW CREATE TABLE。如果碰巧存在数据类型不一致的情况,可能会造成很多麻烦,如果没有SHOW我们就看不到它。

Indexing cookbook

关于Mysql不使用索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41122821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com