Optimize Timeline query by splitting it into sub-queries so it can use indexes
This commit is contained in:
parent
cb6a4b08e2
commit
fd0c625de5
@ -259,7 +259,8 @@ func (p Profile) NextPage(c Cursor) (Feed, error) {
|
|||||||
|
|
||||||
where_clause := "where " + strings.Join(where_clauses, " and ")
|
where_clause := "where " + strings.Join(where_clauses, " and ")
|
||||||
|
|
||||||
q := `select id, user_id, text, posted_at, num_likes, num_retweets, num_replies, num_quote_tweets, in_reply_to_id, quoted_tweet_id,
|
q := `select * from (
|
||||||
|
select id, user_id, text, posted_at, num_likes, num_retweets, num_replies, num_quote_tweets, in_reply_to_id, quoted_tweet_id,
|
||||||
mentions, reply_mentions, hashtags, ifnull(space_id, '') space_id, ifnull(tombstone_types.short_name, "") tombstone_type,
|
mentions, reply_mentions, hashtags, ifnull(space_id, '') space_id, ifnull(tombstone_types.short_name, "") tombstone_type,
|
||||||
is_expandable,
|
is_expandable,
|
||||||
is_stub, is_content_downloaded, is_conversation_scraped, last_scraped_at,
|
is_stub, is_content_downloaded, is_conversation_scraped, last_scraped_at,
|
||||||
@ -267,10 +268,12 @@ func (p Profile) NextPage(c Cursor) (Feed, error) {
|
|||||||
posted_at chrono, user_id by_user_id
|
posted_at chrono, user_id by_user_id
|
||||||
from tweets
|
from tweets
|
||||||
left join tombstone_types on tweets.tombstone_type = tombstone_types.rowid
|
left join tombstone_types on tweets.tombstone_type = tombstone_types.rowid
|
||||||
` + where_clause + `
|
` + where_clause + ` ` + c.SortOrder.OrderByClause() + ` limit ?
|
||||||
|
)
|
||||||
|
|
||||||
union
|
union
|
||||||
|
|
||||||
|
select * from (
|
||||||
select id, user_id, text, posted_at, num_likes, num_retweets, num_replies, num_quote_tweets, in_reply_to_id, quoted_tweet_id,
|
select id, user_id, text, posted_at, num_likes, num_retweets, num_replies, num_quote_tweets, in_reply_to_id, quoted_tweet_id,
|
||||||
mentions, reply_mentions, hashtags, ifnull(space_id, '') space_id, ifnull(tombstone_types.short_name, "") tombstone_type,
|
mentions, reply_mentions, hashtags, ifnull(space_id, '') space_id, ifnull(tombstone_types.short_name, "") tombstone_type,
|
||||||
is_expandable,
|
is_expandable,
|
||||||
@ -282,8 +285,10 @@ func (p Profile) NextPage(c Cursor) (Feed, error) {
|
|||||||
left join tombstone_types on tweets.tombstone_type = tombstone_types.rowid
|
left join tombstone_types on tweets.tombstone_type = tombstone_types.rowid
|
||||||
` + where_clause + `
|
` + where_clause + `
|
||||||
` + c.SortOrder.OrderByClause() + `
|
` + c.SortOrder.OrderByClause() + `
|
||||||
limit ?`
|
limit ?
|
||||||
|
) ` + c.SortOrder.OrderByClause() + ` limit ?`
|
||||||
|
|
||||||
|
bind_values = append(bind_values, c.PageSize)
|
||||||
bind_values = append(bind_values, bind_values...)
|
bind_values = append(bind_values, bind_values...)
|
||||||
bind_values = append(bind_values, c.PageSize)
|
bind_values = append(bind_values, c.PageSize)
|
||||||
|
|
||||||
|
@ -64,7 +64,7 @@ create table tweets (rowid integer primary key,
|
|||||||
);
|
);
|
||||||
create index if not exists index_tweets_in_reply_to_id on tweets (in_reply_to_id);
|
create index if not exists index_tweets_in_reply_to_id on tweets (in_reply_to_id);
|
||||||
create index if not exists index_tweets_user_id on tweets (user_id);
|
create index if not exists index_tweets_user_id on tweets (user_id);
|
||||||
|
create index if not exists index_tweets_posted_at on tweets (posted_at);
|
||||||
|
|
||||||
create table retweets(rowid integer primary key,
|
create table retweets(rowid integer primary key,
|
||||||
retweet_id integer not null unique,
|
retweet_id integer not null unique,
|
||||||
@ -74,6 +74,7 @@ create table retweets(rowid integer primary key,
|
|||||||
foreign key(tweet_id) references tweets(id)
|
foreign key(tweet_id) references tweets(id)
|
||||||
foreign key(retweeted_by) references users(id)
|
foreign key(retweeted_by) references users(id)
|
||||||
);
|
);
|
||||||
|
create index if not exists index_retweets_retweeted_at on retweets (retweeted_at);
|
||||||
|
|
||||||
create table urls (rowid integer primary key,
|
create table urls (rowid integer primary key,
|
||||||
tweet_id integer not null,
|
tweet_id integer not null,
|
||||||
|
@ -116,6 +116,8 @@ var MIGRATIONS = []string{
|
|||||||
foreign key(user_id) references users(id)
|
foreign key(user_id) references users(id)
|
||||||
foreign key(tweet_id) references tweets(id)
|
foreign key(tweet_id) references tweets(id)
|
||||||
);`,
|
);`,
|
||||||
|
`create index if not exists index_tweets_posted_at on tweets (posted_at);
|
||||||
|
create index if not exists index_retweets_retweeted_at on retweets (retweeted_at)`,
|
||||||
}
|
}
|
||||||
var ENGINE_DATABASE_VERSION = len(MIGRATIONS)
|
var ENGINE_DATABASE_VERSION = len(MIGRATIONS)
|
||||||
|
|
||||||
|
@ -93,7 +93,6 @@ func (r SpaceResponse) ToTweetTrove() TweetTrove {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (api API) GetSpace(id SpaceID) (SpaceResponse, error) {
|
func (api API) GetSpace(id SpaceID) (SpaceResponse, error) {
|
||||||
// TODO: break up this URL into params so it's readable
|
|
||||||
url, err := url.Parse(GraphqlURL{
|
url, err := url.Parse(GraphqlURL{
|
||||||
BaseUrl: "https://twitter.com/i/api/graphql/Ha9BKBF0uAz9d4-lz0jnYA/AudioSpaceById",
|
BaseUrl: "https://twitter.com/i/api/graphql/Ha9BKBF0uAz9d4-lz0jnYA/AudioSpaceById",
|
||||||
Variables: GraphqlVariables{
|
Variables: GraphqlVariables{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user