システム
列1 | 列2 | 列3 |
---|---|---|
言語 | Python | 3.6 |
フレームワーク | Django | 2.2 |
ORM | mysqlclient | 1.4.6 |
背景
ある完成されているシステムがあります。
※仮にAシステムとします
このシステムをカスタマイズして別のシステム(Bシステムとします)に機能利用しようとしています。
カスタマイズは順調に運び、Bシステムの検収に入った段階である指摘が飛び出しました。
処理速度が遅い
複雑な処理をしているため、Aシステムのオペレータには理解のあったことがBシステムの担当者には通じなかったのです。
原因
システムの複雑さを盾に正直パフォーマンスチューニングはほぼ諦めていた本システム。
本腰をいれて調査したところとあるクエリが突出して遅いことがわかりました。
sql
1+----+-------------+----------+------------+------+----------------------------+------+---------+------+--------+----------+-------------+ 2| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | 3+----+-------------+----------+------------+------+----------------------------+------+---------+------+--------+----------+-------------+ 4| 1 | SIMPLE | table_aa | NULL | ALL | table_aa__field_aa__index | NULL | NULL | NULL | 646525 | 3.26 | Using where | 5+----+-------------+----------+------------+------+----------------------------+------+---------+------+--------+----------+-------------+
EXPLAINの結果、INDEXが使われていないことが判明。
しかし上記の通りpossible_keysは認識している模様。
そのためFORCE INDEXでなんとかならないか検証したところ、解決できそうな見込みになりました。
sql
1mysql> SELECT ..... ; 21 row in set, 1 warning (1.99 sec) 3 4mysql> SELECT ..... FORCE INDEX(table_aa__field_aa__index) .... ; 51 row in set, 1 warning (0.00 sec) 6
困っていること
ここまでわかったのであとはボトルネックとなるSQLにFORCE INDEXをつけるだけなのですが…
フレームワーク上でどう実現したらよいかわかりません。
ここで言うフレームワーク上とは生SQL(Polls.objects.raw()
など)ではなく、フレームワークで提供している関数で処理したいということになります。
検索して出てくるのはdjango-mysqlのことばかりでmysqlclientに言及したものが調べられませんでした。
フレームワークでなんとかする必要はありません。
my.cnfなどMysql側でなんとかできるのであればそちらでも構いません。
どなたか解決方法を示唆していただけないでしょうか。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー