Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Django:查询集,多个过滤器。我可以设置WHERE子句的形成顺序,以便它能帮助我建立索引吗_Mysql_Django - Fatal编程技术网

Mysql Django:查询集,多个过滤器。我可以设置WHERE子句的形成顺序,以便它能帮助我建立索引吗

Mysql Django:查询集,多个过滤器。我可以设置WHERE子句的形成顺序,以便它能帮助我建立索引吗,mysql,django,Mysql,Django,我在django中有以下查询: end_date = timezone.now() start_date = end_date + timedelta(-5*365) queryset = ( DailyPriceHistory .objects .filte

我在django中有以下查询:

            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 with
IN
大于
。因此,在这种情况下,索引也将没有任何效率OK,这个Q&A讨论的是
=
,在
中讨论的
。注意,
WHERE
中看似很小的差异,答案可能会有很大的差异。似乎我在另一个问答中回答了
whereid>…
。涉及
分区的答案可能对所有人都是最好的。