質問の概要
MySQLでインデックスの設定方法について、「カーディナリティーの低い順」というルールを無視すべきかどうか悩んでいます。アドバイス頂けませんでしょうか。
現状のテーブル
現状「公式の、日本語の、人気順」等の取得があります。
そのために以下posts
テーブルでは、最後の行のindex_popular_posts
のインデックスを設定しました。
公式アカウントも一般ユーザーも多様な言語で投稿できるのがposts
テーブルですが、そのうち「公式の、日本語の、人気順」とか「公式の、英語の、不人気順」等で取得したいためです。
SQL
1CREATE TABLE posts ( 2 ID BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT 3 ,content VARCHAR(1000) CHARACTER SET utf8mb4 NOT NULL 4 ,author_ID BIGINT(20) UNSIGNED NOT NULL DEFAULT 0 5 ,is_trash TINYINT(1) UNSIGNED NOT NULL DEFAULT 0 6 7 #「公式の、日本語の、人気順」等の取得用 8 ,is_offisial TINYINT(1) UNSIGNED NOT NULL DEFAULT 0 9 ,lang_id INT(3) UNSIGNED NOT NULL 10 ,count_iine INT(6) UNSIGNED NOT NULL DEFAULT 0 11 12 # 作成情報 13 ,created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) 14 ,updated_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) 15 16 # 設定 17 ,PRIMARY KEY (ID) 18 ,INDEX index_popular_posts(is_offisial,lang_id,count_iine) #「公式の、日本語の、人気順」等の取得用 19);
発生した問題
このインデックスindex_popular_posts
は「カーディナリティーの低い順」というルールに準拠しています。
is_official
は0|1
のいずれかが入り、lang_id
は10種類の言語が入り、count_iine
にはいいねされた数が入るためです。
しかし今回、「公式の、日本語の、人気順」に限らず、「日本語の、人気順」等の取得が生じましたので質問です。
これはインデックスindex_popular_posts
のうち、最初に設定されている「公式の(is_offisial
)」が抜けた取得となりますので、インデックスが効かないという問題が生じると思います。
考えられる対処法
ここで対処法として、以下①②を考えてみました。
----------
①「カーディナリティーの低い順」というルールを無視する
index_popular_posts(lang_id,is_offisial,count_iine)
というインデックスで設定する
②インデックスを増やす
現状のindex_popular_posts(is_offisial,lang_id,count_iine)
だけでなく、
さらにindex_popular_posts2(lang_id,count_iine)
でも設定する
----------
以上の2つうち、どれがなぜ良いのか?または別の良い対処法があるのか?を知りたいです。
使用環境
select version()
-> 5.7.31
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/26 10:21
2021/12/26 10:37 編集
2021/12/26 10:39