MyS*_*bie 2 mysql performance index null order-by
我下面的 sql 用于列出 10 天前添加的股票。Order by isnull(Price) 被使用,这样没有任何价格的股票仍然会被列出。
AddDate 和 Price 有一个索引。
SELECT Id, Price FROM tblStock
where AddDate >= date_sub(curdate(),interval 10 day)
order by isnull(Price), Price asc limit 50
Run Code Online (Sandbox Code Playgroud)
解释 sql 显示它没有使用价格指数。所以我试图改进查询并提出了以下 sql
SELECT Id, Price FROM tblStock
where AddDate >= date_sub(curdate(),interval 10 day)
and Price is not null
order by Price asc limit 50
Run Code Online (Sandbox Code Playgroud)
新的 sql 运行得更快,并且解释显示它使用价格索引,但问题是永远不会选择具有空值的价格。
寻找有关如何解决此问题的任何意见或建议。谢谢。
您的原始条款:
order by isnull(Price), Price asc limit 50
Run Code Online (Sandbox Code Playgroud)
使用价格列上的函数。在你的情况下,功能是isnull(); 但它并不重要-你的塔,例如任何功能COALESCE(Price, ...),Price + 1等等,会使得对于相同的结果。
您会看到,一旦某列上有一个函数,MySQL 就无法使用该列。考虑:索引在价格上使用 BTREE,按升序索引数百万行。但是你的请求,order by isnull(Price)请求完全不同的东西:你只想提供NULLs 或 not- NULLs;好吧,MySQL 不会为此使用索引。
我认为 MySQL 识别一组“安全”函数会很好,这些函数与索引是单调的;但是 MySQL 在它看到一个函数的那一刻就放弃了一个索引。它只是不预测函数结果的样子。
其他数据库支持索引功能;MariaDB fork 支持虚拟列和虚拟列上的索引——这两种解决方案都可以帮助您完成查询。普通的 MySQL 就是吃不下它。
| 归档时间: |
|
| 查看次数: |
4674 次 |
| 最近记录: |