簡體   English   中英

Django數據庫查詢很慢

[英]Django database queries are slow

我一直認為Django選擇中等大小的查詢時會遇到性能問題。

這是直接在Mysql中運行django查詢的示例;

SELECT * FROM `website_datapoolposition` WHERE (`website_datapoolposition`.`data_pool_id` = 596 AND `website_datapoolposition`.`timestamp` <= '2015-01-24 23:31:33' AND `website_datapoolposition`.`timestamp` >= '2015-01-24 19:01:30');

設置8063行(0.05秒)

在我看來,這很合理。 該表中有約700萬行,索引了時間戳。

但是,當django將這些數據作為值輸入時,它需要0.7秒。 django是否要為原始sql增加14倍的開銷? 我搜尋了我能找到的每一個技巧,似乎沒有什么比我期望的低至80ms。

編輯:

這是此表的Django定義:

#define my models
id          = models.AutoField(primary_key=True)
car         = models.ForeignKey(Car)
lat         = models.DecimalField( max_digits=16, decimal_places=12 )
lng         = models.DecimalField( max_digits=16, decimal_places=12 )
speed       = models.DecimalField( max_digits=5, decimal_places=2, default=0 )
total = models.DecimalField( max_digits=12, decimal_places=2, null=True, blank=True)
dist        = models.DecimalField( max_digits=12, decimal_places=2, null=True, blank=True)
timestamp   = models.DateTimeField( db_index=True )

這是來自show create表的模式:

app_pos | CREATE TABLE `app_pos` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`lat` decimal(16,12) NOT NULL,
`lng` decimal(16,12) NOT NULL,
`speed` decimal(5,2) NOT NULL,
`timestamp` datetime NOT NULL,
`car_id` int(11) NOT NULL,
`total` decimal(12,2) DEFAULT NULL,
`dist` decimal(12,2),
PRIMARY KEY (`id`),
KEY `app_pos_fa16e375` (`car_id`),
KEY `app_pos_timestamp_f13fe0c76a90341_uniq` (`timestamp`),
KEY `app_pos_timestamp_343244cae95f1483_uniq` (`timestamp`),
CONSTRAINT     `app_dat_car_id_feb2a18963295a287_fk_app_car_id` FOREIGN   KEY (`car_id`) REFERENCES `app_car` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7000000 DEFAULT CHARSET=utf8

當您在MySQL cli中運行此查詢時,您將獲得在服務器上執行查詢的時間,而不是將行轉移到另一個進程(甚至是機器)的時間,並從這些行構建8K重對象。

從SQL獲取數據的最快方法是:

data = DataPoolPosition.objects.filter(...).values_list('field1', 'field2')

您將獲得迭代器,其中每行將由元組表示。

另一個選擇是直接執行自定義SQL ,但我認為您不會比values_list()選項獲得values_list()速度改進。

ADD INDEX(data_pool_id, timestamp)

(還有SHOW CREATE TABLE,所以我們知道我們正在使用什么。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM