Open mattyatea opened 1 year ago
リモートユーザー、インスタンスのチャート生成は無効にしています。
このqueryが生成されているのは生成されている箇所は SearchService#searchNote
のようです
https://github.com/misskey-dev/misskey/blob/644023316e85ed9d238007ef6b2177e25c98cf9a/packages/backend/src/core/SearchService.ts#L119
ここの substring
を消して、以下のコードを packages/backend
に配置して実行
import { createPostgresDataSource } from './built/postgres.js'
import { UserProfile } from './built/models/entities/UserProfile.js'
import { Following } from './built/models/entities/Following.js'
import { ChannelFollowing } from './built/models/entities/ChannelFollowing.js'
import { MutedNote } from './built/models/entities/MutedNote.js'
import { Blocking } from './built/models/entities/Blocking.js'
import { NoteThreadMuting } from './built/models/entities/NoteThreadMuting.js'
import { Muting } from './built/models/entities/Muting.js'
import { RenoteMuting } from './built/models/entities/RenoteMuting.js'
import { QueryService } from './built/core/QueryService.js'
import { Note } from './built/models/entities/Note.js'
import { SearchService} from './built/core/SearchService.js'
async function main() {
const ds = createPostgresDataSource({
db: {
host: 'db',
port: 5432,
db: 'misskey',
user: 'postgres',
pass: 'postgres',
disableCache: true,
},
})
const conn = await ds.initialize()
const upr = conn.getRepository(UserProfile)
const fr = conn.getRepository(Following)
const cfr = conn.getRepository(ChannelFollowing)
const mnr = conn.getRepository(MutedNote)
const br = conn.getRepository(Blocking)
const ntmr = conn.getRepository(NoteThreadMuting)
const mr = conn.getRepository(Muting)
const rmr = conn.getRepository(RenoteMuting)
const nr = conn.getRepository(Note)
const queryService = new QueryService(upr, fr, cfr, mnr, br, ntmr, mr, rmr)
const searchService = new SearchService({}, null, nr, queryService, null)
await searchService.searchNote('query', { id: '9grr618q4o'}, {}, {limit: 10})
}
main()
全文検索が重いのは当然でどうしようもないからMeilisearch使ってもらった方がよさそう
https://github.com/misskey-dev/misskey/issues/11078#issuecomment-1617775574
ここで挙げられているslow queryが user-list-timeline
のように見えるので、 generateVisibilityQuery
の箇所か、 query.take()
で追加される DISTINCT
が重い可能性はあるかも? ( note
からのリレーション的に全部 ManyToOne
かOneToOne
なら query.limit()
にすると DISTINCT
は消せるはず )
MisskeyでOneToManyを使っている箇所はなさそうなので全てのtakeをlimitに置き換えても大丈夫かしら
手元で適当に 100 users * 1000 notes のDBを用意して、 大量にマッチするように ILIKE
部分を消して試してみたところ、むしろ DISTINCT
ありの方が早いという結果に
どちらにせよこのくらいの規模だと LIMIT 10
の状況下では 1ms 以下で終わっているので、実際に問題があるDBで EXPLAIN (ANALYZE true)
しないと良くわからなさそうです。
ORDER BYがインデックスが適切でないとダメらしい(知らんけど
Summary
下記なslow queryを改善してほしいです
上記のqueryはこのコード付近で生成されていると思われます https://github.com/misskey-dev/misskey/blob/84d3a066372bfed8bd1d4ac5a469a84075dea954/packages/backend/src/core/chart/charts/federation.ts#L60-L100