mirror of
https://github.com/Foundry376/Mailspring.git
synced 2024-11-12 12:40:08 +08:00
07861f64be
Summary: - Use a sub-select query with much better performance to display the thread list - Perform analyze on tables after launch The new query is: ``` SELECT `Thread`.`data` FROM `Thread` WHERE `Thread`.`id` IN (SELECT `id` FROM `ThreadCategory` AS `M26` WHERE `M26`.`value` IN ('9m9ks71k06n5rmx82kgues09p','9s9k25q6j1krjgpkovbcjm7d','13b7ufruoymvih07ki0uahlto','dtmhlzz6phr47zp512knhjgf8','16dvjb84bszfh15kgfrjj37i3','aclwmgncdqjfibp51bvgbeik','17qad7jhbp6tozog3klm5zagt','4x4bkbawiq825u4eu3aus8tll','7axr9f5f1lzpwm2rw2ghkirhq','dsnn660af0pmou2gg3nstga8a','361qr5rva1ieby2r0ec3sn0bm','10fyvba7pjyjgeyr5i65i1zri') AND `M26`.`in_all_mail` = 1 ORDER BY `M26`.`last_message_received_timestamp` DESC LIMIT 200 OFFSET 0) ORDER BY `Thread`.`last_message_received_timestamp` DESC; ` 0|0|0|SEARCH TABLE Thread USING INDEX Thread_id (id=?) 0|0|0|EXECUTE LIST SUBQUERY 1 1|0|0|SCAN TABLE Thread-Category AS M26 USING COVERING INDEX ThreadFancyIndex 1|0|0|EXECUTE LIST SUBQUERY 2 0|0|0|USE TEMP B-TREE FOR (only on 200 result items) ``` Which is twice as performant as: ``` SELECT `Thread`.`data` FROM `Thread` INNER JOIN `ThreadCategory` AS `M26` ON `M26`.`id` = `Thread`.`id` WHERE `M26`.`value` IN ('9m9ks71k06n5rmx82kgues09p','9s9k25q6j1krjgpkovbcjm7d','13b7ufruoymvih07ki0uahlto','dtmhlzz6phr47zp512knhjgf8','16dvjb84bszfh15kgfrjj37i3','aclwmgncdqjfibp51bvgbeik','17qad7jhbp6tozog3klm5zagt','4x4bkbawiq825u4eu3aus8tll','7axr9f5f1lzpwm2rw2ghkirhq','361qr5rva1ieby2r0ec3sn0bm','10fyvba7pjyjgeyr5i65i1zri') AND `M26`.`in_all_mail` = 1 ORDER BY `M26`.`last_message_received_timestamp` DESC LIMIT 200 OFFSET 0; 0|0|1|SCAN TABLE Thread-Category AS M26 USING COVERING INDEX ThreadFancyIndex 0|0|0|EXECUTE LIST SUBQUERY 1 0|1|0|SEARCH TABLE Thread USING INDEX Thread_id (id=?) ``` Test Plan: Broken! Reviewers: evan, juan Reviewed By: juan Differential Revision: https://phab.nylas.com/D2869
116 lines
3.1 KiB
CoffeeScript
116 lines
3.1 KiB
CoffeeScript
Category = require '../../src/flux/models/category'
|
|
Model = require '../../src/flux/models/model'
|
|
Attributes = require '../../src/flux/attributes'
|
|
|
|
class TestModel extends Model
|
|
@attributes =
|
|
'id': Attributes.String
|
|
queryable: true
|
|
modelKey: 'id'
|
|
|
|
'clientId': Attributes.String
|
|
queryable: true
|
|
modelKey: 'clientId'
|
|
jsonKey: 'client_id'
|
|
|
|
'serverId': Attributes.ServerId
|
|
queryable: true
|
|
modelKey: 'serverId'
|
|
jsonKey: 'server_id'
|
|
|
|
TestModel.configureBasic = ->
|
|
TestModel.additionalSQLiteConfig = undefined
|
|
TestModel.attributes =
|
|
'id': Attributes.String
|
|
queryable: true
|
|
modelKey: 'id'
|
|
'clientId': Attributes.String
|
|
queryable: true
|
|
modelKey: 'clientId'
|
|
jsonKey: 'client_id'
|
|
'serverId': Attributes.ServerId
|
|
queryable: true
|
|
modelKey: 'serverId'
|
|
jsonKey: 'server_id'
|
|
|
|
TestModel.configureWithAllAttributes = ->
|
|
TestModel.additionalSQLiteConfig = undefined
|
|
TestModel.attributes =
|
|
'datetime': Attributes.DateTime
|
|
queryable: true
|
|
modelKey: 'datetime'
|
|
'string': Attributes.String
|
|
queryable: true
|
|
modelKey: 'string'
|
|
jsonKey: 'string-json-key'
|
|
'boolean': Attributes.Boolean
|
|
queryable: true
|
|
modelKey: 'boolean'
|
|
'number': Attributes.Number
|
|
queryable: true
|
|
modelKey: 'number'
|
|
'other': Attributes.String
|
|
modelKey: 'other'
|
|
|
|
TestModel.configureWithCollectionAttribute = ->
|
|
TestModel.additionalSQLiteConfig = undefined
|
|
TestModel.attributes =
|
|
'id': Attributes.String
|
|
queryable: true
|
|
modelKey: 'id'
|
|
'clientId': Attributes.String
|
|
queryable: true
|
|
modelKey: 'clientId'
|
|
jsonKey: 'client_id'
|
|
'serverId': Attributes.ServerId
|
|
queryable: true
|
|
modelKey: 'serverId'
|
|
jsonKey: 'server_id'
|
|
'other': Attributes.String
|
|
queryable: true,
|
|
modelKey: 'other'
|
|
'categories': Attributes.Collection
|
|
queryable: true,
|
|
modelKey: 'categories'
|
|
itemClass: Category,
|
|
joinOnField: 'id',
|
|
joinQueryableBy: ['other'],
|
|
|
|
TestModel.configureWithJoinedDataAttribute = ->
|
|
TestModel.additionalSQLiteConfig = undefined
|
|
TestModel.attributes =
|
|
'id': Attributes.String
|
|
queryable: true
|
|
modelKey: 'id'
|
|
'clientId': Attributes.String
|
|
queryable: true
|
|
modelKey: 'clientId'
|
|
jsonKey: 'client_id'
|
|
'serverId': Attributes.ServerId
|
|
queryable: true
|
|
modelKey: 'serverId'
|
|
jsonKey: 'server_id'
|
|
'body': Attributes.JoinedData
|
|
modelTable: 'TestModelBody'
|
|
modelKey: 'body'
|
|
|
|
|
|
TestModel.configureWithAdditionalSQLiteConfig = ->
|
|
TestModel.attributes =
|
|
'id': Attributes.String
|
|
queryable: true
|
|
modelKey: 'id'
|
|
'clientId': Attributes.String
|
|
modelKey: 'clientId'
|
|
jsonKey: 'client_id'
|
|
'serverId': Attributes.ServerId
|
|
modelKey: 'serverId'
|
|
jsonKey: 'server_id'
|
|
'body': Attributes.JoinedData
|
|
modelTable: 'TestModelBody'
|
|
modelKey: 'body'
|
|
TestModel.additionalSQLiteConfig =
|
|
setup: ->
|
|
['CREATE INDEX IF NOT EXISTS ThreadListIndex ON Thread(last_message_received_timestamp DESC, account_id, id)']
|
|
|
|
module.exports = TestModel
|