Mysql Django:查询集,多个过滤器。我可以设置WHERE子句的形成顺序,以便它能帮助我建立索引吗
我在django中有以下查询:Mysql Django:查询集,多个过滤器。我可以设置WHERE子句的形成顺序,以便它能帮助我建立索引吗,mysql,django,Mysql,Django,我在django中有以下查询: end_date = timezone.now() start_date = end_date + timedelta(-5*365) queryset = ( DailyPriceHistory .objects .filte
end_date = timezone.now()
start_date = end_date + timedelta(-5*365)
queryset = (
DailyPriceHistory
.objects
.filter(symbol=symbol,datetime_utc__range=(start_date, end_date))
.order_by('datetime')
.order_by('creation_time')
.values_list('high','low','open','datetime','close','creation_time')
)
它生成的Sql是
SELECT `daily_price_history`.`high`,
`daily_price_history`.`low`,
`daily_price_history`.`open`,
`daily_price_history`.`datetime`,
`daily_price_history`.`close`,
`daily_price_history`.`creation_time`
FROM `daily_price_history`
WHERE (`daily_price_history`.`datetime_utc`
BETWEEN '2015-12-04 18:43:28.710229'
AND '2020-12-02 18:43:28.710229'
AND `daily_price_history`.`symbol` = 'A')
ORDER BY `daily_price_history`.`creation_time` ASC
目前我有symbol
和datatime
作为单独的索引列
我发现了为什么不遵循过滤器顺序。i、 e.filter(symbol=symbol,datetime\utc\uu range=(开始日期,结束日期))
我想要
WHERE (`daily_price_history`.`symbol` = 'A'
AND `daily_price_history`.`datetime_utc`
BETWEEN '2015-12-04 18:43:28.710229'
AND '2020-12-02 18:43:28.710229')
但它使用
WHERE (`daily_price_history`.`datetime_utc`
BETWEEN '2015-12-04 18:43:28.710229'
AND '2020-12-02 18:43:28.710229'
AND `daily_price_history`.`symbol` = 'A')
另外,我在sql中没有看到order\u by('datetime')
,这是因为datetime
被索引了吗
WHERE (foo) AND (bar)
与优化相同
WHERE (bar) AND (foo)
但是,这些在不同的情况下是有用的:
INDEX(a,b)
INDEX(b,a)
你需要
INDEX(symbol, datetime)
不考虑中的顺序,其中
但这是有效的,因为
WHERE symbol = '...' -- Equality test (put first in index)
AND datetime BETWEEN ... -- range test (put last in index)
无论索引是什么,这都可能无法有效执行:
WHERE symbol IN (...) -- IN() is harder than = to optimize
AND datatime BETWEEN ...
你的问题没有重点,因为你有多个问题。总而言之:为什么你认为语句的顺序很重要,你认为使用两次顺序应该产生什么?你能看到我问过的一个类似的问题吗,
https://stackoverflow.com/questions/65150483/mysql-how-to-speed-up-an-sql-query-for-getting-data
。在这里,我使用where withIN
和大于
。因此,在这种情况下,索引也将没有任何效率OK,这个Q&A讨论的是=
,在中讨论的。注意,WHERE
中看似很小的差异,答案可能会有很大的差异。似乎我在另一个问答中回答了whereid>…
。涉及分区的答案可能对所有人都是最好的。