- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试执行 SQL 查询。不幸的是,它不使用索引,而是进行表扫描。
我已经创建了以下索引:
此外,我复制了该表,但这也没有提供任何有用的结果。
这是表结构:
+--------------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------------+--------------+------+-----+---------+-------+
| $id | varchar(100) | NO | | NULL | |
| $created_date | varchar(100) | YES | | NULL | |
| $phone | varchar(100) | NO | PRI | NULL | |
| $source | varchar(100) | YES | | NULL | |
| Orga | varchar(100) | YES | | NULL | |
| Anrede | varchar(100) | YES | | NULL | |
| Vorname | varchar(100) | YES | | NULL | |
| Zuname | varchar(100) | YES | | NULL | |
| Strasse | varchar(100) | YES | | NULL | |
| PLZ | varchar(100) | YES | | NULL | |
| Ort | varchar(100) | YES | | NULL | |
| Geburtsdatum | varchar(100) | YES | | NULL | |
| Email | varchar(100) | YES | | NULL | |
| Zeitschrift | varchar(100) | YES | | NULL | |
| Herkunft | varchar(100) | YES | | NULL | |
| Zeitschrift_Titel | varchar(100) | YES | | NULL | |
| telefon | varchar(100) | YES | | NULL | |
| Stornogrund | varchar(100) | YES | | NULL | |
| Storno | varchar(100) | YES | | NULL | |
| Telefonnummer | varchar(100) | YES | | NULL | |
| Postleitzahl | varchar(100) | YES | | NULL | |
| Geburtsjahr | varchar(100) | YES | | NULL | |
| $$fc_task | varchar(100) | YES | | NULL | |
| $$fc_user | varchar(100) | YES | | NULL | |
| $$fc_date | varchar(100) | NO | PRI | NULL | |
| $$fc_status | varchar(100) | YES | MUL | NULL | |
| $$fc_status_detail | varchar(100) | YES | MUL | NULL | |
| $$qc_task | varchar(100) | YES | | NULL | |
| $$qc_user | varchar(100) | YES | | NULL | |
| $$qc_date | varchar(100) | YES | | NULL | |
| $$qc_status | varchar(100) | YES | | NULL | |
| $$qc_status_detail | varchar(100) | YES | | NULL | |
| $call_duration | smallint(6) | YES | | NULL | |
| $call_attempts | smallint(6) | YES | | NULL | |
+--------------------+--------------+------+-----+---------+-------+
这是查询:
EXPLAIN SELECT
count(*) as total,
CONCAT(case when c1.$$fc_date < 240 then "short" else "long" end, "/", c1.$$fc_status, "/", c1.$$fc_status_detail) as ergebnis,
sum(case when c2.$$fc_status = 'success' then 1 else 0 end)/ count(*) as c2_succes_rate
FROM
contacts c1 FORCE INDEX (PRIMARY),
contacts_copy c2
WHERE
c1.$phone = c2.$phone
and c1.$$fc_date < c2.$$fc_date
group by
ergebnis
这是结果:
+------+-------------+-------+------+--------------------------------------------------------------+---------+---------+---------------+---------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+-------+------+--------------------------------------------------------------+---------+---------+---------------+---------+---------------------------------+
| 1 | SIMPLE | c1 | ALL | PRIMARY | NULL | NULL | NULL | 2017450 | Using temporary; Using filesort |
| 1 | SIMPLE | c2 | ref | PRIMARY,contacts_copy_$phone_IDX,contacts_copy_$$fc_date_IDX | PRIMARY | 402 | nmv.c1.$phone | 1 | Using where |
+------+-------------+-------+------+--------------------------------------------------------------+---------+---------+---------------+---------+---------------------------------+
正如您在第 1 行中看到的,虽然它识别 PRIMARY 键,但它不使用它。问题是它扫描了 2 Mio。行且查询持续至少 5 分钟。
有人可以解释一下,问题可能是什么吗?
最佳答案
您正在使用 InnoDB,对吗? InnoDB 辅助键(例如 INDEX(phone)
)隐式包含 PRIMARY KEY
的列。因此,索引实际上是一个 (phone, fc_date)
的 BTree。
接下来,我们注意到 c2
还需要另一列:fc_status
。因此,优化器研究了两种运行查询的方法。首先,请注意,这两种方法都在索引中具有最佳列,并且它们处于最佳顺序。
A 计划:使用索引,然后在索引和数据之间来回切换。
B 计划:进行表扫描,不需要来回。
优化器正确选择了 B。
你可以有一个更好的索引,优化器很可能会选择它。而且会更快:
INDEX(phone, fc_date, fc_status) -- in this order
这是“覆盖”,因为所有需要的列都存在。因此,不会有任何来回。
我需要批评VARCHAR(100)
。这对于日期来说可能非常糟糕,因为根据格式,它们可能无法正确排序。
名称可能永远不会有 100 个字符;电子邮件可能会更长。等等4个电话号码?怎么了?
关于mysql - 如何强制mariaDB使用索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56233560/
我在 CentOS 6.4 上运行 MariaDB (10.0.2-MariaDB) 并且想使用 MariaDB 的 CONNECT-Engine 从一些日志文件中读取。由于日志文件很大,我用两个 C
MariaDB 是否支持嵌套事务(不是保存点)? 我希望能够在存储过程中使用嵌套事务。目前在 MySQL 中,我将一个参数“useTransaction”传递给每个存储过程,它控制我是否在该存储过程的
MariaDb 的默认端口是什么? 我是编程新手。我正在创建我的第一个连接到 MariaDB 的 Java 应用程序。我需要指定数据库端口。 最佳答案 Mariadb 的默认端口是 3306。 它与
ubuntu:~$ sudo apt-get install mariadb-server Reading package lists... Done Building dependency tr
我在Ubuntu 18.04上使用的是Mariadb 10.4.10,工具客户端是DBeaver 6.2.5 我想充分利用 Mariadb 中的约束检查功能来确保数据完整性,因为它是从 10.2.1
当我在 phpmyadmin 中运行这个 sql 时 SELECT @@SQL_MODE, @@GLOBAL.SQL_MODE; 表明 @@SQL_MODE STRICT_TRANS_TABLES,E
我正在尝试使用 MariaDB 10.1.12 的联合引擎来创建基于远程数据库中的表的表。关注MariaDB instructions关于如何使用 FederatedX 实现,在数据库 db1 中我创
我在该数据库中有此列,其中包含空格键,我想更改它。 ALTER TABLE . CHANGE COLUMN `Anzahl Personen` AnzahlPersonen int(11); 在命令行
我正在尝试安装 maria db 并遇到以下问题。 [root@localhost ~]# service mysqld start Redirecting to /bin/systemctl sta
我已经基于 mariadb:10.1 构建了一个图像这基本上添加了一个新的 cluster.conf但是在第一个节点开始成功工作后,在第二个节点上面临以下错误。有人可以帮我在这里调试吗? 错误日志尾部
我已阅读 the docs用于 MariaDB REGEX_REPLACE但无法让我的查询工作。我将链接存储在一列中,link并想更改链接的结尾: 来自 www.example.com/至 www.e
我在 MariaDB 的 ColumnStore 上发现的每一项分析都声称它使用的磁盘空间比 InnoDB 等常规引擎少,例如:https://www.percona.com/blog/2017/03
如何在 MariaDB 中重置密码?我使用 Windows 而不是 Linux。谁知道如何重置我的 MySQL MariaDB 密码?我尝试在 Google 上搜索但没有帮助。 最佳答案 我遇到了同样
我正在尝试将 Quarkus 与 MariaDB 图像一起用于测试。 使用 mvn integration-test 启动测试时,我得到以下信息: Unable to start devservice
我正在尝试更新存储在 MariaDB 的 json 列中的数据(libmysql 版本 - 5.6.43,服务器:10.3.34-MariaDB-cll-lve - MariaDB 服务器)。 我的数
我有一个使用 MariaDB 中的表定义的多对多关系。我正在尝试将 Entity Framework Core 中的导航属性用于相关实体,但它们没有水合。 roles | role_id | role
Entity Framework Core 是否支持 MariaDB? 我看到它不在 supported providers 的列表中,但 MySQL 是。也许 MySQL 提供程序会针对 Maria
我在 MariaDb (10.4.10-MariaDB-1:10.4.10+maria~bionic) 中有一个巨大的表,我正在使用添加一个新列 alter table Appointment add
有没有一种方法可以监听 MySQL/MariaDB 中的数据库更改,就像您可以跟踪 MongoDB oplog 一样?我在网上找不到关于此的信息。也许它只适用于 Postgres 而不适用于 MySQ
我刚刚在 Centos 7 中安装了 MariaDB 10.3 数据库服务器。 一切顺利,但在执行“systemctl status mariadb”命令时。这是完整的输出: root@vps [/e
我是一名优秀的程序员,十分优秀!