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

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

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

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

Q&A

解決済

3回答

672閲覧

MySql:複数条件のクエリの高速化方法

yonotsui

総合スコア28

MySQL

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

0グッド

0クリップ

投稿2020/11/10 18:04

2つのカラム「FeeSetTime」「MonorateBuyNum」を不等号でwhereしています。
カラムはそれぞれインデックスを作成しているため片方だけ利用する場合は1秒かからないのですが、併用すると1分近くかかります。
現在テーブルの行数は700万行ほどあり、これから1億以上に増やす予定です。
ですので改善できなければ運用できません。
どうすればクエリの速度を改善できるのかご教授いただけないでしょうか。

バージョン:8.0.18

クエリ

select ASIN from asin where FeeSetTime<637379791894140198&& MonorateBuyNum>=15 order by FeeSetTime ASC limit 20; ※orderを使用しなくても速度に差は出ません  カラムと比較している値はその時の用途によって変えるので一意的ではありません。

テーブル構造

+-------------------------+----------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------------------+----------------------+------+-----+---------+-------+ | ASIN | varchar(10) | NO | PRI | NULL | | | JAN | varchar(13) | YES | | NULL | | | Title | varchar(1024) | YES | | NULL | | | ImageUrl | varchar(2048) | YES | | NULL | | | FixFee | smallint(6) | YES | | NULL | | | FeeRate | float(2,2) | YES | | NULL | | | PriceFBA | int(11) | YES | | NULL | | | PriceSelf | int(11) | YES | | NULL | | | PriceCart | int(11) | YES | | NULL | | | NotExit | bit(1) | NO | | NULL | | | SettingFee | bit(2) | NO | | NULL | | | SettingProductItem | bit(2) | NO | | NULL | | | SettingJAN | bit(2) | NO | | NULL | | | PriceSetTime | bigint(20) | NO | MUL | NULL | | | ProductItemSetTime | bigint(20) | NO | MUL | NULL | | | FeeSetTime | bigint(20) | NO | MUL | NULL | | | SellerNum | smallint(6) | YES | | NULL | | | HadFBA | bit(1) | NO | | NULL | | | SettingMonorate | bit(2) | NO | | NULL | | | MonorateSetTime | bigint(20) | NO | MUL | NULL | | | MonorateBuyNum | smallint(6) | NO | MUL | NULL | | | TitleOpt | varchar(1024) | YES | | NULL | | | Danger | bit(1) | NO | | NULL | | | Claim | bit(1) | NO | | NULL | | | MonorateNoExitRate | float(3,3) | NO | | NULL | | | MonorateNoExitRateTotal | float(3,3) | NO | | NULL | | | SettingCategory | bit(2) | NO | | NULL | | | CategorySetTime | bigint(20) | NO | | NULL | | | CategoryHash | int(10) unsigned | YES | | NULL | | | CategoryHash2 | int(10) unsigned | YES | | NULL | | | CategoryHash3 | int(10) unsigned | YES | | NULL | | | PriceUsedFBA | int(11) | YES | | NULL | | | PriceUsedSelf | int(11) | YES | | NULL | | | DHashSetTime | bigint(20) | NO | MUL | NULL | | | DHash | varchar(1024) | YES | | NULL | | | RankingCategoryHash1 | int(10) unsigned | YES | | NULL | | | RankingCategoryHash2 | int(10) unsigned | YES | | NULL | | | RankingCategoryHash3 | int(10) unsigned | YES | | NULL | | | Ranking1 | int(11) | YES | MUL | NULL | | | Ranking2 | int(11) | YES | | NULL | | | Ranking3 | int(11) | YES | | NULL | | | PricePreFBA | int(11) | YES | | NULL | | | PricePreSelf | int(11) | YES | | NULL | | | PricePreUsedFBA | int(11) | YES | | NULL | | | PricePreUsedSelf | int(11) | YES | | NULL | | | PricePreCart | int(11) | YES | | NULL | | | SetTypeSer | smallint(5) unsigned | YES | | NULL | | | NoCommunicationTick | bigint(20) | NO | MUL | NULL | | | Width | int(10) unsigned | YES | | NULL | | | Height | int(10) unsigned | YES | | NULL | | | Lenght | int(10) unsigned | YES | | NULL | | | Weight | int(10) unsigned | YES | | NULL | | | SizeTypeSer | smallint(5) unsigned | NO | | NULL | | | JAN2 | varchar(13) | YES | | NULL | | | JAN3 | varchar(13) | YES | | NULL | | | JAN4 | varchar(13) | YES | | NULL | | | JAN5 | varchar(13) | YES | | NULL | | +-------------------------+----------------------+------+-----+---------+-------+

###インデックス

+-------+------------+------------------+--------------+---------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression | +-------+------------+------------------+--------------+---------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+ | asin | 0 | PRIMARY | 1 | ASIN | A | 6484142 | NULL | NULL | | BTREE | | | YES | NULL | | asin | 1 | noc_idx | 1 | NoCommunicationTick | A | 9573 | NULL | NULL | | BTREE | | | YES | NULL | | asin | 1 | price_idx | 1 | PriceSetTime | A | 57374 | NULL | NULL | | BTREE | | | YES | NULL | | asin | 1 | product_idx | 1 | ProductItemSetTime | A | 139095 | NULL | NULL | | BTREE | | | YES | NULL | | asin | 1 | fee_idx | 1 | FeeSetTime | A | 51695 | NULL | NULL | | BTREE | | | YES | NULL | | asin | 1 | dhash_idx | 1 | DHashSetTime | A | 375445 | NULL | NULL | | BTREE | | | YES | NULL | | asin | 1 | monoratetime_idx | 1 | MonorateSetTime | A | 428457 | NULL | NULL | | BTREE | | | YES | NULL | | asin | 1 | rank_idx | 1 | Ranking1 | A | 178598 | NULL | NULL | YES | BTREE | | | YES | NULL | | asin | 1 | monorate_idx | 1 | MonorateBuyNum | A | 198 | NULL | NULL | | BTREE | | | YES | NULL | +-------+------------+------------------+--------------+---------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+

###explain

+----+-------------+-------+------------+-------+----------------------+---------+---------+------+---------+----------+------------------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+-------+----------------------+---------+---------+------+---------+----------+------------------------------------+ | 1 | SIMPLE | asin | NULL | range | fee_idx,monorate_idx | fee_idx | 8 | NULL | 3242510 | 4.92 | Using index condition; Using where | +----+-------------+-------+------------+-------+----------------------+---------+---------+------+---------+----------+------------------------------------+

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

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

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

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

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

guest

回答3

0

ベストアンサー

カラムはそれぞれインデックスを作成している

2つのカラム「FeeSetTime」「MonorateBuyNum」でひとつのインデックスを用意してください。不要なインデックスは削りましょう。

投稿2020/11/10 18:45

Orlofsky

総合スコア16415

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

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

0

併用すると1分近くかかります。

select ではfrom句で指定される一つのテーブルに対し、使用されるインデックスは1つです。
併用などはされません。

limitを使用する前提なら
(FeeSetTime, MonorateBuyNum desc)
というインデックスの方が効率的だと思われます。

投稿2020/11/11 06:17

編集2020/11/11 06:48
sazi

総合スコア25173

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

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

0

2つセットのインデックスで作ればよかったんですね
おかげさまで30秒かかったクエリが1秒ほどに短縮できました。
お二人ともありがとうございました。

投稿2020/11/11 12:07

yonotsui

総合スコア28

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問