Retrieving closest date to input date
I have the following function:
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$$
Which basically just returns the closest date (previous date) to the input date. It runs extremely slow though, since the table is very large.
Anyone have any idea how to optimize this?
mysql
add a comment |
I have the following function:
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$$
Which basically just returns the closest date (previous date) to the input date. It runs extremely slow though, since the table is very large.
Anyone have any idea how to optimize this?
mysql
Isfp_v2_fp_basic_prices.p_date
indexed? What doesexplain select ...
say?
– Schwern
Nov 14 '18 at 21:00
@Schwern I am not sure what indexed in this context means. I started using SQL 2 days ago.
– Chris
Nov 14 '18 at 21:03
Index are very important for efficient SQL. Your code is very impressive for day 2.
– Schwern
Nov 14 '18 at 21:12
@Schwern Thank you. I still feel like I struggle to really understand the ups and downs but I find your comment encouraging!
– Chris
Nov 14 '18 at 21:18
add a comment |
I have the following function:
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$$
Which basically just returns the closest date (previous date) to the input date. It runs extremely slow though, since the table is very large.
Anyone have any idea how to optimize this?
mysql
I have the following function:
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$$
Which basically just returns the closest date (previous date) to the input date. It runs extremely slow though, since the table is very large.
Anyone have any idea how to optimize this?
mysql
mysql
asked Nov 14 '18 at 20:59
ChrisChris
1039
1039
Isfp_v2_fp_basic_prices.p_date
indexed? What doesexplain select ...
say?
– Schwern
Nov 14 '18 at 21:00
@Schwern I am not sure what indexed in this context means. I started using SQL 2 days ago.
– Chris
Nov 14 '18 at 21:03
Index are very important for efficient SQL. Your code is very impressive for day 2.
– Schwern
Nov 14 '18 at 21:12
@Schwern Thank you. I still feel like I struggle to really understand the ups and downs but I find your comment encouraging!
– Chris
Nov 14 '18 at 21:18
add a comment |
Isfp_v2_fp_basic_prices.p_date
indexed? What doesexplain select ...
say?
– Schwern
Nov 14 '18 at 21:00
@Schwern I am not sure what indexed in this context means. I started using SQL 2 days ago.
– Chris
Nov 14 '18 at 21:03
Index are very important for efficient SQL. Your code is very impressive for day 2.
– Schwern
Nov 14 '18 at 21:12
@Schwern Thank you. I still feel like I struggle to really understand the ups and downs but I find your comment encouraging!
– Chris
Nov 14 '18 at 21:18
Is
fp_v2_fp_basic_prices.p_date
indexed? What does explain select ...
say?– Schwern
Nov 14 '18 at 21:00
Is
fp_v2_fp_basic_prices.p_date
indexed? What does explain select ...
say?– Schwern
Nov 14 '18 at 21:00
@Schwern I am not sure what indexed in this context means. I started using SQL 2 days ago.
– Chris
Nov 14 '18 at 21:03
@Schwern I am not sure what indexed in this context means. I started using SQL 2 days ago.
– Chris
Nov 14 '18 at 21:03
Index are very important for efficient SQL. Your code is very impressive for day 2.
– Schwern
Nov 14 '18 at 21:12
Index are very important for efficient SQL. Your code is very impressive for day 2.
– Schwern
Nov 14 '18 at 21:12
@Schwern Thank you. I still feel like I struggle to really understand the ups and downs but I find your comment encouraging!
– Chris
Nov 14 '18 at 21:18
@Schwern Thank you. I still feel like I struggle to really understand the ups and downs but I find your comment encouraging!
– Chris
Nov 14 '18 at 21:18
add a comment |
1 Answer
1
active
oldest
votes
First, check what explain select ...
says.
Are fp_v2_fp_basic_prices.fsym_id
and fp_v2_fp_basic_prices.p_date
indexed? An index allows the database to quickly match and compare rows without having to look at all of them. If there's no index it will have to compare every row in the table.
For example...
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 |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
This shows the query is doing a full table scan. It's using no key (index), the type of query is ALL
, and it thinks it has to look at all 3 rows in the table.
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 |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+------------------------------+
This is after adding an index. Select tables optimized away
tells us the optimizer has figured out it can use the index to optimize away the whole query.
In your case you're searching by two columns, fsym_id
and p_date
. MySQL will only use one index per table in a query. So even if you have an index on fsym_id
and an index on p_date
it will only use one. To make this query perform very well you need both in a single index.
alter table fp_v2_fp_basic_prices add index(p_date, fsym_id);
This will work for queries that only use p_date
as well as queries which use both p_date
+ fsym_id
together. So you don't need an index on just p_date
. But it does not cover queries which only use fsym_id
. See this answer for more detail.
See also:
- https://dev.mysql.com/doc/refman/5.7/en/explain-output.html
- https://dev.mysql.com/doc/refman/5.7/en/optimization-indexes.html
- http://www.mysqltutorial.org/mysql-index/
- https://www.tutorialspoint.com/mysql/mysql-indexes.htm
I just checked. The table is indexed on the date I try to look up even.
– Chris
Nov 14 '18 at 21:22
@Chris Checkfsym_id
as well. And be sure to check whatexplain
says, maybe add that to your answer. MySQL can only use one index per table, so you may have to create a composite index of bothfsym_id
andp_date
. See stackoverflow.com/questions/1823685/…
– Schwern
Nov 14 '18 at 21:25
I use MySQL Workbench and it shows that there are two indexes and those are fsym_id and p_date.
– Chris
Nov 14 '18 at 21:28
Also it does not show when I use Explain Select since I call this function in another select statement. Basically I in my select statement I have: f_prevpricedate(p.fsym_id,p_date) AS Previous_Date
– Chris
Nov 14 '18 at 21:36
@Chris If there are two separate indexes it can only use one of them to partially cut down on the number of rows to scan. If you make one index forp_date, fsym_id
that can replace the lonep_date
index. To useexplain
copy yourSELECT MAX(f.p_date) INTO prevpricedate ...
out of its function and work with it as a single statement until you've got it optimized. If you're using MySQL 8 what you're trying to accomplish might be better done with a window function.
– Schwern
Nov 14 '18 at 21:42
|
show 3 more comments
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53308619%2fretrieving-closest-date-to-input-date%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
First, check what explain select ...
says.
Are fp_v2_fp_basic_prices.fsym_id
and fp_v2_fp_basic_prices.p_date
indexed? An index allows the database to quickly match and compare rows without having to look at all of them. If there's no index it will have to compare every row in the table.
For example...
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 |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
This shows the query is doing a full table scan. It's using no key (index), the type of query is ALL
, and it thinks it has to look at all 3 rows in the table.
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 |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+------------------------------+
This is after adding an index. Select tables optimized away
tells us the optimizer has figured out it can use the index to optimize away the whole query.
In your case you're searching by two columns, fsym_id
and p_date
. MySQL will only use one index per table in a query. So even if you have an index on fsym_id
and an index on p_date
it will only use one. To make this query perform very well you need both in a single index.
alter table fp_v2_fp_basic_prices add index(p_date, fsym_id);
This will work for queries that only use p_date
as well as queries which use both p_date
+ fsym_id
together. So you don't need an index on just p_date
. But it does not cover queries which only use fsym_id
. See this answer for more detail.
See also:
- https://dev.mysql.com/doc/refman/5.7/en/explain-output.html
- https://dev.mysql.com/doc/refman/5.7/en/optimization-indexes.html
- http://www.mysqltutorial.org/mysql-index/
- https://www.tutorialspoint.com/mysql/mysql-indexes.htm
I just checked. The table is indexed on the date I try to look up even.
– Chris
Nov 14 '18 at 21:22
@Chris Checkfsym_id
as well. And be sure to check whatexplain
says, maybe add that to your answer. MySQL can only use one index per table, so you may have to create a composite index of bothfsym_id
andp_date
. See stackoverflow.com/questions/1823685/…
– Schwern
Nov 14 '18 at 21:25
I use MySQL Workbench and it shows that there are two indexes and those are fsym_id and p_date.
– Chris
Nov 14 '18 at 21:28
Also it does not show when I use Explain Select since I call this function in another select statement. Basically I in my select statement I have: f_prevpricedate(p.fsym_id,p_date) AS Previous_Date
– Chris
Nov 14 '18 at 21:36
@Chris If there are two separate indexes it can only use one of them to partially cut down on the number of rows to scan. If you make one index forp_date, fsym_id
that can replace the lonep_date
index. To useexplain
copy yourSELECT MAX(f.p_date) INTO prevpricedate ...
out of its function and work with it as a single statement until you've got it optimized. If you're using MySQL 8 what you're trying to accomplish might be better done with a window function.
– Schwern
Nov 14 '18 at 21:42
|
show 3 more comments
First, check what explain select ...
says.
Are fp_v2_fp_basic_prices.fsym_id
and fp_v2_fp_basic_prices.p_date
indexed? An index allows the database to quickly match and compare rows without having to look at all of them. If there's no index it will have to compare every row in the table.
For example...
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 |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
This shows the query is doing a full table scan. It's using no key (index), the type of query is ALL
, and it thinks it has to look at all 3 rows in the table.
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 |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+------------------------------+
This is after adding an index. Select tables optimized away
tells us the optimizer has figured out it can use the index to optimize away the whole query.
In your case you're searching by two columns, fsym_id
and p_date
. MySQL will only use one index per table in a query. So even if you have an index on fsym_id
and an index on p_date
it will only use one. To make this query perform very well you need both in a single index.
alter table fp_v2_fp_basic_prices add index(p_date, fsym_id);
This will work for queries that only use p_date
as well as queries which use both p_date
+ fsym_id
together. So you don't need an index on just p_date
. But it does not cover queries which only use fsym_id
. See this answer for more detail.
See also:
- https://dev.mysql.com/doc/refman/5.7/en/explain-output.html
- https://dev.mysql.com/doc/refman/5.7/en/optimization-indexes.html
- http://www.mysqltutorial.org/mysql-index/
- https://www.tutorialspoint.com/mysql/mysql-indexes.htm
I just checked. The table is indexed on the date I try to look up even.
– Chris
Nov 14 '18 at 21:22
@Chris Checkfsym_id
as well. And be sure to check whatexplain
says, maybe add that to your answer. MySQL can only use one index per table, so you may have to create a composite index of bothfsym_id
andp_date
. See stackoverflow.com/questions/1823685/…
– Schwern
Nov 14 '18 at 21:25
I use MySQL Workbench and it shows that there are two indexes and those are fsym_id and p_date.
– Chris
Nov 14 '18 at 21:28
Also it does not show when I use Explain Select since I call this function in another select statement. Basically I in my select statement I have: f_prevpricedate(p.fsym_id,p_date) AS Previous_Date
– Chris
Nov 14 '18 at 21:36
@Chris If there are two separate indexes it can only use one of them to partially cut down on the number of rows to scan. If you make one index forp_date, fsym_id
that can replace the lonep_date
index. To useexplain
copy yourSELECT MAX(f.p_date) INTO prevpricedate ...
out of its function and work with it as a single statement until you've got it optimized. If you're using MySQL 8 what you're trying to accomplish might be better done with a window function.
– Schwern
Nov 14 '18 at 21:42
|
show 3 more comments
First, check what explain select ...
says.
Are fp_v2_fp_basic_prices.fsym_id
and fp_v2_fp_basic_prices.p_date
indexed? An index allows the database to quickly match and compare rows without having to look at all of them. If there's no index it will have to compare every row in the table.
For example...
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 |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
This shows the query is doing a full table scan. It's using no key (index), the type of query is ALL
, and it thinks it has to look at all 3 rows in the table.
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 |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+------------------------------+
This is after adding an index. Select tables optimized away
tells us the optimizer has figured out it can use the index to optimize away the whole query.
In your case you're searching by two columns, fsym_id
and p_date
. MySQL will only use one index per table in a query. So even if you have an index on fsym_id
and an index on p_date
it will only use one. To make this query perform very well you need both in a single index.
alter table fp_v2_fp_basic_prices add index(p_date, fsym_id);
This will work for queries that only use p_date
as well as queries which use both p_date
+ fsym_id
together. So you don't need an index on just p_date
. But it does not cover queries which only use fsym_id
. See this answer for more detail.
See also:
- https://dev.mysql.com/doc/refman/5.7/en/explain-output.html
- https://dev.mysql.com/doc/refman/5.7/en/optimization-indexes.html
- http://www.mysqltutorial.org/mysql-index/
- https://www.tutorialspoint.com/mysql/mysql-indexes.htm
First, check what explain select ...
says.
Are fp_v2_fp_basic_prices.fsym_id
and fp_v2_fp_basic_prices.p_date
indexed? An index allows the database to quickly match and compare rows without having to look at all of them. If there's no index it will have to compare every row in the table.
For example...
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 |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
This shows the query is doing a full table scan. It's using no key (index), the type of query is ALL
, and it thinks it has to look at all 3 rows in the table.
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 |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+------------------------------+
This is after adding an index. Select tables optimized away
tells us the optimizer has figured out it can use the index to optimize away the whole query.
In your case you're searching by two columns, fsym_id
and p_date
. MySQL will only use one index per table in a query. So even if you have an index on fsym_id
and an index on p_date
it will only use one. To make this query perform very well you need both in a single index.
alter table fp_v2_fp_basic_prices add index(p_date, fsym_id);
This will work for queries that only use p_date
as well as queries which use both p_date
+ fsym_id
together. So you don't need an index on just p_date
. But it does not cover queries which only use fsym_id
. See this answer for more detail.
See also:
- https://dev.mysql.com/doc/refman/5.7/en/explain-output.html
- https://dev.mysql.com/doc/refman/5.7/en/optimization-indexes.html
- http://www.mysqltutorial.org/mysql-index/
- https://www.tutorialspoint.com/mysql/mysql-indexes.htm
edited Nov 14 '18 at 23:07
answered Nov 14 '18 at 21:11
SchwernSchwern
90k17102232
90k17102232
I just checked. The table is indexed on the date I try to look up even.
– Chris
Nov 14 '18 at 21:22
@Chris Checkfsym_id
as well. And be sure to check whatexplain
says, maybe add that to your answer. MySQL can only use one index per table, so you may have to create a composite index of bothfsym_id
andp_date
. See stackoverflow.com/questions/1823685/…
– Schwern
Nov 14 '18 at 21:25
I use MySQL Workbench and it shows that there are two indexes and those are fsym_id and p_date.
– Chris
Nov 14 '18 at 21:28
Also it does not show when I use Explain Select since I call this function in another select statement. Basically I in my select statement I have: f_prevpricedate(p.fsym_id,p_date) AS Previous_Date
– Chris
Nov 14 '18 at 21:36
@Chris If there are two separate indexes it can only use one of them to partially cut down on the number of rows to scan. If you make one index forp_date, fsym_id
that can replace the lonep_date
index. To useexplain
copy yourSELECT MAX(f.p_date) INTO prevpricedate ...
out of its function and work with it as a single statement until you've got it optimized. If you're using MySQL 8 what you're trying to accomplish might be better done with a window function.
– Schwern
Nov 14 '18 at 21:42
|
show 3 more comments
I just checked. The table is indexed on the date I try to look up even.
– Chris
Nov 14 '18 at 21:22
@Chris Checkfsym_id
as well. And be sure to check whatexplain
says, maybe add that to your answer. MySQL can only use one index per table, so you may have to create a composite index of bothfsym_id
andp_date
. See stackoverflow.com/questions/1823685/…
– Schwern
Nov 14 '18 at 21:25
I use MySQL Workbench and it shows that there are two indexes and those are fsym_id and p_date.
– Chris
Nov 14 '18 at 21:28
Also it does not show when I use Explain Select since I call this function in another select statement. Basically I in my select statement I have: f_prevpricedate(p.fsym_id,p_date) AS Previous_Date
– Chris
Nov 14 '18 at 21:36
@Chris If there are two separate indexes it can only use one of them to partially cut down on the number of rows to scan. If you make one index forp_date, fsym_id
that can replace the lonep_date
index. To useexplain
copy yourSELECT MAX(f.p_date) INTO prevpricedate ...
out of its function and work with it as a single statement until you've got it optimized. If you're using MySQL 8 what you're trying to accomplish might be better done with a window function.
– Schwern
Nov 14 '18 at 21:42
I just checked. The table is indexed on the date I try to look up even.
– Chris
Nov 14 '18 at 21:22
I just checked. The table is indexed on the date I try to look up even.
– Chris
Nov 14 '18 at 21:22
@Chris Check
fsym_id
as well. And be sure to check what explain
says, maybe add that to your answer. MySQL can only use one index per table, so you may have to create a composite index of both fsym_id
and p_date
. See stackoverflow.com/questions/1823685/…– Schwern
Nov 14 '18 at 21:25
@Chris Check
fsym_id
as well. And be sure to check what explain
says, maybe add that to your answer. MySQL can only use one index per table, so you may have to create a composite index of both fsym_id
and p_date
. See stackoverflow.com/questions/1823685/…– Schwern
Nov 14 '18 at 21:25
I use MySQL Workbench and it shows that there are two indexes and those are fsym_id and p_date.
– Chris
Nov 14 '18 at 21:28
I use MySQL Workbench and it shows that there are two indexes and those are fsym_id and p_date.
– Chris
Nov 14 '18 at 21:28
Also it does not show when I use Explain Select since I call this function in another select statement. Basically I in my select statement I have: f_prevpricedate(p.fsym_id,p_date) AS Previous_Date
– Chris
Nov 14 '18 at 21:36
Also it does not show when I use Explain Select since I call this function in another select statement. Basically I in my select statement I have: f_prevpricedate(p.fsym_id,p_date) AS Previous_Date
– Chris
Nov 14 '18 at 21:36
@Chris If there are two separate indexes it can only use one of them to partially cut down on the number of rows to scan. If you make one index for
p_date, fsym_id
that can replace the lone p_date
index. To use explain
copy your SELECT MAX(f.p_date) INTO prevpricedate ...
out of its function and work with it as a single statement until you've got it optimized. If you're using MySQL 8 what you're trying to accomplish might be better done with a window function.– Schwern
Nov 14 '18 at 21:42
@Chris If there are two separate indexes it can only use one of them to partially cut down on the number of rows to scan. If you make one index for
p_date, fsym_id
that can replace the lone p_date
index. To use explain
copy your SELECT MAX(f.p_date) INTO prevpricedate ...
out of its function and work with it as a single statement until you've got it optimized. If you're using MySQL 8 what you're trying to accomplish might be better done with a window function.– Schwern
Nov 14 '18 at 21:42
|
show 3 more comments
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53308619%2fretrieving-closest-date-to-input-date%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Is
fp_v2_fp_basic_prices.p_date
indexed? What doesexplain select ...
say?– Schwern
Nov 14 '18 at 21:00
@Schwern I am not sure what indexed in this context means. I started using SQL 2 days ago.
– Chris
Nov 14 '18 at 21:03
Index are very important for efficient SQL. Your code is very impressive for day 2.
– Schwern
Nov 14 '18 at 21:12
@Schwern Thank you. I still feel like I struggle to really understand the ups and downs but I find your comment encouraging!
– Chris
Nov 14 '18 at 21:18