Mysql 正在检索与输入日期最近的日期

Mysql 正在检索与输入日期最近的日期,mysql,Mysql,我有以下功能: DELIMITER $$ DROP FUNCTION IF EXISTS f_prevpricedate; CREATE FUNCTION f_prevpricedate (id CHAR(8), startdate DATE) RETURNS DATE BEGIN DECLARE prevpricedate DATE; SELECT MAX(f.p_date) INTO prevpricedate FROM fp_v2_fp_basic_prices AS f WHER

我有以下功能:

DELIMITER $$
DROP FUNCTION IF EXISTS f_prevpricedate;
CREATE FUNCTION f_prevpricedate (id CHAR(8), startdate DATE)
RETURNS DATE

BEGIN

DECLARE prevpricedate DATE;

SELECT MAX(f.p_date) INTO prevpricedate
FROM fp_v2_fp_basic_prices AS f 
WHERE f.fsym_id = id AND f.p_date<startdate;

RETURN prevpricedate; 

END$$
分隔符$$
如果存在f_prevpricedate,则删除函数;
创建函数f_prevpricedate(id字符(8),startdate日期)
返回日期
开始
宣布日期;
在prevpricedate中选择MAX(f.p_日期)
来自fp_v2_fp_基本价格,作为f
其中f.fsym_id=id和f.p_date首先,检查所述内容

是否对
fp\u v2\u fp\u基本价格、fsym\u id
fp\u v2\u fp\u基本价格、p\u日期
进行了索引?索引允许数据库快速匹配和比较行,而无需查看所有行。如果没有索引,它将不得不比较表中的每一行

mysql> alter table foo add index foo_this (this);
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> explain select max(this) from foo where this < 42;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+------------------------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra                        |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+------------------------------+
|  1 | SIMPLE      | NULL  | NULL       | NULL | NULL          | NULL | NULL    | NULL | NULL |     NULL | Select tables optimized away |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+------------------------------+
例如

mysql> select count(*) from foo;                                                                                                                              
+----------+
| count(*) |
+----------+
|        3 |
+----------+

mysql> explain select max(this) from foo where this < 42;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | foo   | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    3 |    33.33 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
这是在添加索引之后进行的
Select tables optimized away
告诉我们优化器已经发现可以使用索引优化整个查询


在本例中,您将按两列进行搜索,
fsym\u id
p\u date
。MySQL在查询中每个表只使用一个索引。因此,即使您在
fsym\u id
上有一个索引,在
p\u date
上有一个索引,它也只会使用一个。要使此查询执行得非常好,您需要在单个索引中同时执行这两个查询

alter table fp_v2_fp_basic_prices add index(p_date, fsym_id);
这将适用于仅使用
p\u日期
的查询以及同时使用
p\u日期
+
fsym\u id
的查询。因此,您不需要仅在
p_date
上建立索引。但它不包括仅使用
fsym\u id
的查询。有关更多详细信息,请参阅

另见:


是否为基本价格编制了索引?
explain select…
say是什么意思?@Schwern我不确定这个上下文中的索引是什么意思。我两天前开始使用SQL。索引对于高效的SQL非常重要。您的代码在第2天给人留下了深刻的印象。@Schwern谢谢您。我仍然觉得我很难真正理解起起伏伏,但我觉得你的评论令人鼓舞!我刚查过。该表在我试图查找的日期编制索引。@chrischeck
fsym\u id
。并且一定要检查
解释
所说的内容,也许可以将其添加到您的答案中。MySQL每个表只能使用一个索引,因此您可能需要创建一个包含
fsym\u id
p\u date
的复合索引。请看,我使用MySQL Workbench,它显示有两个索引,分别是fsym_id和p_date。另外,当我使用Explain Select时,它没有显示,因为我在另一个Select语句中调用了这个函数。基本上,我在select语句中有:f_prevpricedate(p.fsym_id,p_date)和前面的一样_Date@Chris如果有两个单独的索引,它只能使用其中一个来部分减少要扫描的行数。如果为
p\u日期创建一个索引,则fsym\u id
可以替换单独的
p\u日期
索引。要使用
explain
将您的
复制到prevpricedate…
中,请从其函数中选择MAX(f.p_date)并将其作为单个语句使用,直到您对其进行了优化。如果您使用的是MySQL 8,那么使用一个。