索引布尔列与日期时间列的查询性能

2024-01-13

如果索引设置为datetime键入列,而不是boolean输入列(并且查询是在该列上完成的)?

在我当前的设计中,我有两列:

  • is_active小整数(1),indexed
  • deleted_at约会时间

查询是SELECT * FROM table WHERE is_active = 1;

如果我在上面建立索引,会不会慢一些deleted_at列,并运行这样的查询SELECT * FROM table WHERE deleted_at is null; ?


这是具有 10M 行的 MariaDB (10.0.19) 基准(使用序列插件 https://mariadb.com/kb/en/mariadb/sequence/):

drop table if exists test;
CREATE TABLE `test` (
    `id` MEDIUMINT UNSIGNED NOT NULL,
    `is_active` TINYINT UNSIGNED NOT NULL,
    `deleted_at` TIMESTAMP NULL,
    PRIMARY KEY (`id`),
    INDEX `is_active` (`is_active`),
    INDEX `deleted_at` (`deleted_at`)
) ENGINE=InnoDB
    select seq id
        , rand(1)<0.5 as is_active
        , case when rand(1)<0.5 
            then null
            else '2017-03-18' - interval floor(rand(2)*1000000) second
        end as deleted_at
    from seq_1_to_10000000;

来衡量我使用的时间set profiling=1并运行show profile执行查询后。从分析结果中我取值Sending data因为其他所有事情总共都不到一毫秒。

TINYINT index:

SELECT COUNT(*) FROM test WHERE is_active = 1;

运行时间:~738 msec

时间戳 index:

SELECT COUNT(*) FROM test WHERE  deleted_at is null;

运行时间:~748 msec

索引大小:

select database_name, table_name, index_name, stat_value*@@innodb_page_size
from mysql.innodb_index_stats 
where database_name = 'tmp'
  and table_name = 'test'
  and stat_name = 'size'

Result:

database_name | table_name | index_name | stat_value*@@innodb_page_size
-----------------------------------------------------------------------
tmp           | test       | PRIMARY    | 275513344 
tmp           | test       | deleted_at | 170639360 
tmp           | test       | is_active  |  97107968 

请注意,虽然 TIMESTAMP(4 字节)的长度是 TYNYINT(1 字节)的 4 倍,但索引大小甚至还不到两倍。但如果索引大小无法装入内存,则索引大小可能会很大。所以当我改变时innodb_buffer_pool_size from 1G to 50M我得到以下数字:

  • 丁宁:~960 msec
  • 时间戳:~1500毫秒

Update

为了更直接地解决这个问题,我对数据做了一些更改:

  • 我使用 DATETIME 而不是 TIMESTAMP
  • 由于条目通常很少被删除,所以我使用rand(1)<0.99(删除 1%)而不是rand(1)<0.5(删除了 50%)
  • 表大小从 10M 行更改为 1M 行。
  • SELECT COUNT(*)变成SELECT *

索引大小:

index_name | stat_value*@@innodb_page_size
------------------------------------------
PRIMARY    | 25739264
deleted_at | 12075008
is_active  | 11026432

因为 99%deleted_at值为 NULL 时,索引大小没有显着差异,但非空 DATETIME 需要 8 个字节 (MariaDB)。

SELECT * FROM test WHERE is_active = 1;      -- 782 msec
SELECT * FROM test WHERE deleted_at is null; -- 829 msec

删除两个索引后,两个查询都会在大约 350 毫秒内执行。并放弃is_activedeleted_at is null查询在 280 毫秒内执行。

请注意,这仍然不是一个现实的场景。您不太可能希望从 1M 行中选择 990K 行并将其交付给用户。表中可能还会有更多列(可能包括文本)。但它表明,您可能不需要is_active列(如果它不添加附加信息),并且任何索引在最好的情况下对于选择未删除的条目都是无用的。

但是,索引对于选择已删除的行很有用:

SELECT * FROM test WHERE is_active = 0;

有索引时执行时间为 10 毫秒,无索引时执行时间为 170 毫秒。

SELECT * FROM test WHERE deleted_at is not null;

有索引时执行时间为 11 毫秒,无索引时执行时间为 167 毫秒。

丢弃is_active列,有索引时执行时间为 4 毫秒,无索引时执行时间为 150 毫秒。

因此,如果这种情况在某种程度上适合您的数据,那么结论将是:删除is_active列并且不创建索引deleted_at如果您很少选择已删除的条目,请参阅列。或者根据您的需要调整基准并得出自己的结论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

索引布尔列与日期时间列的查询性能 的相关文章

  • Android:了解 OnDrawFrame、FPS 和 VSync (OpenGL ES 2.0)

    一段时间以来 我在 Android 游戏中遇到了运动精灵间歇性 卡顿 的情况 这是一个非常简单的 2D OpenGL ES 2 0 游戏 这是一个持续存在的问题 我已经多次重新访问过 在我的游戏循环中 我有 2 个 计时器 一个用于记录前一
  • 使用 Laravel 和 Eloquent 从表中选择全部

    我正在使用 Laravel 4 设置我的第一个模型 以从名为的表中提取所有行posts 在标准 MySQL 中我会使用 SELECT FROM posts 如何在 Laravel 4 模型中实现这一目标 我的完整模型源代码如下
  • 如何插入包含“&”的字符串

    如何编写包含 字符的插入语句 例如 如果我想将 J J Construction 插入数据库的列中 我不确定这是否有什么不同 但我正在使用 Oracle 9i 我总是忘记这一点 然后又回到它 我认为最好的答案是迄今为止提供的答复的组合 首先
  • MySQL 组合两个查询

    我有两个 MySQL 查询 QUERY SELECT sodnik 1 FROM prihodnji krog WHERE file id 8778 AND sodnik 1 UNION SELECT sodnik 2 FROM priho
  • value >= all(select v2 ...) 产生与 value = (select max(v2) ...) 不同的结果

    Here https stackoverflow com questions 17026651 query from union of joins 17027784 noredirect 1 comment24611997 17027784
  • 迁移问题:MS SQL > MySQL:插入缓冲区内存

    我在使用 MySQL Workbench 上的内置迁移工具时遇到问题 我正在将一个非常大的数据库从 MS SQL 2014 迁移到 MySQL MS SQL 服务器本地部署在我的 Windows 8 1 桌面上 MySQL 服务器在我的网络
  • 在生产代码/服务器上运行测试

    我在单元测试 自动化测试方面相对缺乏经验 所以如果这个问题没有任何意义 请原谅 我当前正在处理的代码库耦合如此紧密 以至于我需要重构大部分代码才能对其运行单元测试 所以我阅读了一些帖子并发现了 Selenium 我认为它确实是一个很酷的程序
  • SQL Server - SQL 替换整个数据库中所有表中的所有列

    这是一个很遥远的事情 我猜这个问题没有简单的答案 但是 我继承了一个数据库 其中填充了一些可怕的数据 许多包含描述的行都有回车符 这意味着当我们 BCP 输出数据时 它会带有回车符 我的问题 有没有办法在 MS SQL Server 中对整
  • 更高效的 LINQ 查询

    有人可以帮我将此查询循环变成高效的 Linq 查询吗 我将其加载到 TreeView 中 因此必须附加每个项目 包含也非常低效 延迟加载项目也不起作用 事实上 这个查询访问数据库的次数比应有的要多 public IQueryable
  • 将数据表传递到存储过程。有没有更好的办法?

    数据表可以以某种方式传递到 SQL Server 2005 或 2008 中吗 我知道标准方法似乎是将 XML 传递给 SP 并且可以通过某种方式轻松地将数据表转换为 XML 来实现这一点 将 NET 对象传递到 SP 怎么样 那可能吗 我
  • DataTables 第 2 页的分页未调用放大弹出窗口

    所以我有这个启用分页的数据表 我编码了一种方式 以便用户可以编辑表的行 当用户调用它在放大弹出窗口中打开的编辑页面时 它在第 1 页 从第 2 页起都运行良好 DataTable 及其前面停止调用 Magnific Popup 我只是不明白
  • 从一张表更新并插入另一张表

    我有两张桌子 table1 ID 代码 姓名 table2 ID 代码 姓名 具有相同的列 我想将数据从 table1 插入到 table2 或更新列 如果 table2 中存在 table1 ID table2 ID 执行此操作的简单方法
  • 如何删除MySQL中的所有事件

    如果我想删除某个事件 我需要查询类似的内容 DROP EVENT IF EXISTS eventname 但我找不到一次性删除所有事件的命令 必须一项一项地删除 有没有一次性删除所有事件的SQL DROP EVENT IF EXISTS S
  • 将非常大的Python列表输出保存到mysql表中

    我想将 python 生成的列表的输出保存在 mysql 数据库的表中 该表如下所示 mysql 中的 myapc8 表 https i stack imgur com 4B4Hz png这是Python代码 在此输入图像描述 https
  • 如何在 Postgresql 中将 GIST 或 GIN 索引与 hstore 列一起使用?

    我正在使用 postgresql 9 3 的 hstore 我正在尝试对 hstore 列使用索引就像文档所述 http www postgresql org docs 9 3 static hstore html 我的问题是索引似乎没有被
  • 如何修复“未知变量'sql-mode = ANSI'”?

    使用 MySQL 5 5 27 在 my cnf 中我有 mysql sql mode ANSI 启动 mysql 控制台后我得到 unknown variable sql mode TRADITIONAL MySQL 文档服务器 SQL
  • 什么是更好的?子查询或内连接十个表?

    一个旧系统已抵达我们的办公室进行一些更改和修复 但它也存在性能问题 我们并不确切知道这种缓慢的根源是什么 当我们重构旧代码时 我们发现了几个具有以下模式的 sql 查询 出于示例目的 简化了查询 SELECT SELECT X FROM A
  • 如何在sql server 2008R2中将单个单元格拆分为多个列?

    我想将每个名称拆分为各个列 create table split test value integer Allnames varchar 40 insert into split test values 1 Vinoth Kumar Raj
  • 控制数据是否存在于数组中

    我在mysql中有两个不同的表 我正在使用curl从json文件中获取数据 我的第一个表名称是 tblclients 该表存储客户端数据 我的第二个表名称是 tblcustomfieldsvalues 该表使用 tblclients 表的
  • 为什么python+sqlite3特别慢?

    我尝试使用 Python 2 7 4 sqlite3 和 Firefox SQLite Manager 0 8 0 处理对同一数据库的相同请求 在小型数据库 8000 条记录 上 Python 和 Firefox 都运行得很快并且给出了相同

随机推荐

  • 是否可以将参数传递给 Perl 模块加载?

    我目前正在开发一个多环境 perl 脚本 众所周知 如果做得不好 环境配置杂耍可能会非常痛苦 由于我的 Perl 脚本必须允许某些命令行参数用于配置值重载 因此我采用了以下解决方案 package Cfg use strict use wa
  • 如何在具有百分比高度的 div 中间垂直对齐文本? [复制]

    这个问题在这里已经有答案了 这是我现在所拥有的 在其他div中使用vertical align middle并设置line height与相同的值height属性它应该可以工作 唯一的事情是在这些 div 中我使用像素尺寸而不是百分比 谁能
  • 如何向多行文本框添加一行?

    我怎样才能添加一行文本到多线 http msdn microsoft com en us library system windows forms textboxbase multiline 28v VS 80 29 aspx TextBo
  • Solr:使用 EdgeNGramFilterFactory 进行精确短语查询

    在 Solr 3 3 中 是否可以通过EdgeNGramFilterFactory并且对短语查询也敏感 例如 我正在寻找一个字段 如果包含 contrat informatique 则在用户键入以下内容时将找到该字段 contrat 信息学
  • 情节大小固定在闪亮?调整大小不起作用

    我尝试改装this https plot ly r shinyapp plotly events 适合我的目的的闪亮应用程序 由于我想在其上方添加一些文本 因此我使用 Rmd 格式 以下代码与链接中的代码完全相同 只是我删除了服务器和用户界
  • 如何根据包含特定值的行(在任何列中)过滤数据框

    我需要限制数据集 以便它仅返回包含特定字符串的行 但是 该字符串可以存在于许多 8 列中 我怎样才能做到这一点 我见过 str isin 方法 但它返回单行的单个系列 如何删除任何列中包含该字符串的任何行 示例代码 如果我有由生成的数据框
  • UITableView - 辞去外部触摸的第一响应者

    我有一个 UITableView 和一个关联的 UITableViewController 但是 我已经修改了该表 使其也有一个带有文本字段子视图的视图 与往常一样 我希望当用户点击 完成 简单 以及触摸屏幕上除文本字段之外的其他任何位置时
  • 使用变量作为索引来回显批处理文件数组?

    如果我有一个批处理文件 并且我正在设置带有变量索引的数组 echo off SET x 1 SET myVar x happy 我该如何回应才能获得 快乐 我试过了 ECHO myVar x ECHO myVar x ECHO myVar
  • Java 9 + maven + junit:测试代码是否需要自己的 module-info.java 以及将其放在哪里?

    假设我有一个使用 Maven 3 和 junit 的 Java 项目 有src main java and src test java分别包含主要源和测试源的目录 一切都是标准的 现在我想将项目迁移到Java 9 src main java
  • 为什么 python 切片语法不从负索引环绕到正索引?

    我注意到 鉴于l 1 2 3 that l 1 回报 3 正如预期的那样 但是l 1 0 回报 与我的预期非常不同 然后我尝试了 1 1 我期望返回 3 1 但它也会返回 切片语法不从负索引环绕到正索引 反之亦然 是否有充分的理由 看起来它
  • SonarQube/SonarLint/Visual Studio:对解决方案中的所有项目使用一个规则集

    我们目前正在评估 SonarQube SonarLint 在我们的 NET 应用程序中的使用情况 我们对迄今为止所看到的情况非常满意 顺便说一句 值得称赞的是 SonarQube 已经走到了这一步 几年前我在我的博士项目中使用了它 从那时起
  • 如何使用 OleDb 读取 Oracle 中的 CLOB 列?

    我在 Oracle 10g 数据库上创建了一个具有以下结构的表 create table myTable id number 32 0 primary key myData clob 我可以毫无问题地在表中插入行 但是当我尝试使用 OleD
  • 如何以及何时使用 PreventDefault()?

    由此tutorial http blog nmsdvid com when to use return false and when preventdefault 据说 preventDefault 做一件事 停止浏览器默认设置 行为 我在
  • SharedObject 支持哪些数据类型?

    我知道用 SharedObject 存储字符串和数字是一件简单的事情 而且我也熟悉这类事情 var sharedObject SharedObject SharedObject getLocal userData var obj Objec
  • http://localhost/undefined 404(未找到)

    我的问题描述不清楚 让我再尝试一次 注意 这是我的生产 登台和开发网站 不仅仅是评论者似乎认为的那样只是我的开发网站 常见的问题 注意 使用 Chrome 时会出现此问题 而使用 Firefox 时不会出现此问题 问题出现在网站首页 htt
  • 将变量传递到 Zend Form

    我有一个实例化的 zend 表单 form Form Example 现在我想将 ID 从我的控制器传递到我的表单 所以我这样做了 form Form Example array id gt id 在表单内我尝试通过以下方式调用它 this
  • Android 表格布局中的右对齐列

    我想绘制一个表格 其中最后一列应位于表格的最右侧 表格行如下所示 Admin 2 New Network 2 New 事情应该是这样的 Admin 2 New Network 2 New XML
  • “未绑定到有效相机”CameraX 错误

    我试图遵循谷歌的 CameraX入门 代码实验室 我尝试用Java而不是Kotlin来完成它 但是当我运行它并尝试拍照时 它给了我一个错误 说未绑定到有效的相机 我在代码中找不到错误所在 我检查了 logcat 它说表面可能存在问题 它可能
  • 检测实际的形式变化?

    是否有一种现成的方法 也许在一个框架中 来检测表单是否具有changed与其原始值相比 onchange 事件不会执行 因为无论实际更改如何 它都会触发 例如 我可以使用两个 onchange 事件勾选一个复选框 然后再次关闭 最后的手段是
  • 索引布尔列与日期时间列的查询性能

    如果索引设置为datetime键入列 而不是boolean输入列 并且查询是在该列上完成的 在我当前的设计中 我有两列 is active小整数 1 indexed deleted at约会时间 查询是SELECT FROM table W