当前位置: 首页 > 面试题库 >

MySQL日期时间索引不起作用

艾哲
2023-03-14
问题内容

表结构:

+-------------+----------+------+-----+---------+----------------+
| Field       | Type     | Null | Key | Default | Extra          |
+-------------+----------+------+-----+---------+----------------+
| id          | int(11)  | NO   | PRI | NULL    | auto_increment |
| total       | int(11)  | YES  |     | NULL    |                |
| thedatetime | datetime | YES  | MUL | NULL    |                |
+-------------+----------+------+-----+---------+----------------+

总行数: 137967

mysql> explain select * from out where thedatetime <= NOW();
+----+-------------+-------------+------+---------------+------+---------+------+--------+-------------+
| id | select_type | table       | type | possible_keys | key  | key_len | ref  | rows   | Extra       |
+----+-------------+-------------+------+---------------+------+---------+------+--------+-------------+
|  1 | SIMPLE      | out         | ALL  | thedatetime   | NULL | NULL    | NULL | 137967 | Using where |
+----+-------------+-------------+------+---------------+------+---------+------+--------+-------------+

带有更多表联接的真实查询要更长得多,关键是,我无法使表使用datetime索引。如果要选择特定日期之前的所有数据,这对我来说将很难。但是,我注意到,如果选择较小的数据子集,则可以使MySQL使用索引。

mysql> explain select * from out where thedatetime <= '2008-01-01';
+----+-------------+-------------+-------+---------------+-------------+---------+------+-------+-------------+
| id | select_type | table       | type  | possible_keys | key         | key_len | ref  | rows  | Extra       |
+----+-------------+-------------+-------+---------------+-------------+---------+------+-------+-------------+
|  1 | SIMPLE      | out         | range | thedatetime   | thedatetime | 9       | NULL | 15826 | Using where |
+----+-------------+-------------+-------+---------------+-------------+---------+------+-------+-------------+

mysql> select count(*) from out where thedatetime <= '2008-01-01';
+----------+
| count(*) |
+----------+
|    15990 |
+----------+

那么,无论我放置什么日期,该如何确保MySQL将使用索引?


问题答案:

一切都按预期进行。:)

有索引可以加快检索速度。他们使用索引查找来完成。

在你第一次查询中不使用索引,因为使用的是指数慢检索所有行,在这种情况下(lookup indexget rowlookup indexget row… x行数是那么慢get all rows==表扫描)

在第二个查询中,您只检索一部分数据,在这种情况下,表扫描要慢得多。

优化器的工作是使用RDBMS保留在索引上的统计信息来确定最佳计划。在第一种情况下,考虑了索引,但是计划者(正确地)将其丢弃。

编辑
你可能想读的东西像这样得到关于MySQL的查询规划的一些概念和关键字。



 类似资料:
  • 问题内容: 我有一个包含表的MySQL数据库。 但是,我找不到在Java中将其作为Java中某种对象返回的方法。 我可以打电话给它,它会返回,但这并不好,因为没有办法比较字符串上的日期等。 我也可以打电话,但这根本不返回时间。 问题答案: 您需要使用Thomas的注释中建议的getTime()或getTimestamp()方法。举个例子… 说出要查询的表格,如下所示: 您可以这样做: 如果要使用J

  • 问题内容: 全部, 我有一个带有称为时间戳记的列的MYSQL表。它的数据类型为“ 10/1/2009 3:25:08 PM”,“ 10/1/2009 3:30:05 PM”,“ 10/4/2009 3:40:01 PM”,等等.. 我想编写一个SQL查询来选择在两个日期之间出现的时间戳字段中的所有值。 userInput日期将没有时间部分。您能为此建议正确的MySQL查询语法吗?谢谢 问题答案:

  • 问题内容: 我有一个查询说: 我知道事实上有8条记录具有该日期。但是此查询不会提取该日期的记录。这8条记录既有时间又有“短日期”(例如“ 2011年5月31日下午1:42:00”) 作为测试,我将一条记录的日期设置为2011年5月31日,查询将适用于该记录。显然,时间值正在干扰此查询。 我不想将所有日期数据更改为严格的“短日期”格式,而是希望按原样使用它。任何人都可以给我一些想法,让我知道如何进行

  • 问题内容: 我有一个包含datetime列的表。我希望无论何时都返回给定日期的所有记录。换句话说,如果我的表仅包含以下4条记录,那么如果我限制为2012-12-25,则仅返回第二和第三条记录。 问题答案: 永远不要 使用像这样的选择器-它是性能杀手: 它将为所有不匹配的行(包括那些行)计算 它将无法使用索引进行查询 使用起来更快 因为这将允许索引使用而无需计算。 编辑 正如Used_By_Alre

  • 我正在尝试将时间戳值转换为twig文件中的日期格式,但出现以下错误。 错误: 在呈现模板期间引发了异常(“DateTime::\构造():无法分析时间字符串(

  • 问题内容: 有谁知道如何将JS dateTime转换为MySQL datetime?还有一种方法可以向JS日期时间添加特定的分钟数,然后将其传递给MySQL日期时间? 问题答案: 尽管JS确实拥有足够的基本工具来执行此操作,但它相当笨拙。