質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1171閲覧

django+mysqlclientで FORCE INDEX を使用したい

al_aya_yuka

総合スコア98

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/02/18 08:11

編集2020/02/18 11:51

システム

列1列2列3
言語Python3.6
フレームワークDjango2.2
ORMmysqlclient1.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側でなんとかできるのであればそちらでも構いません。
どなたか解決方法を示唆していただけないでしょうか。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2020/02/18 08:45

フレームワークに生SQLを実行する機能がないということでしょうか?
al_aya_yuka

2020/02/18 11:48

説明不足申し訳ありません。 いいえ、生SQLを発行する機能自体はありますが、できればそれを使いたくないので回避できないでしょうか、という意図です。
guest

回答1

0

ベストアンサー

Djangoから素のSQLを投げる方法はあるようです。

素の SQL 文の実行 | Django ドキュメント | Django

あとは拡張でできるようにしているライブラリはあるっぽい。逆に言うと素のdjangoでは厳しいかもしれません。
Django-MySQL Documentation — Django-MySQL 3.3.0 documentation
使う:Django-MySQL - Qiita

投稿2020/02/18 10:13

編集2020/02/18 11:57
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

al_aya_yuka

2020/02/19 01:23

ご教授いただきありがとうございました。 Django-MySqlまではたどり着いていたのですが、使い方を間違っていました。 示唆いいただいたURLが大変参考になりました。 おかげで解決できました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問