私はこのようなクエリを持っています:
select count(*) from people where text_field is not null;
遅いです。ミディアムテキストフィールドにインデックスを付けるのはコーシャですか?これのベストプラクティスは何ですか?
私はこのようなクエリを持っています:
select count(*) from people where text_field is not null;
遅いです。ミディアムテキストフィールドにインデックスを付けるのはコーシャですか?これのベストプラクティスは何ですか?
このis not null
クエリ述語は、インデックスを作成できないことで有名です。これは、SQLのnull比較が直感的ではないためです。
最善の策は、これらの空でないtext_field値を見つける他の方法を見つけることです。このクエリを頻繁に実行する必要がある場合は、何らかのフラグ値を格納する必要があります。
たとえば、text_field_lengthというINT列を追加し、text_fieldの長さを入力してから、text_field_length>0の場所を選択します。
8年後に編集
MySQL(5.7以降)およびMariaDBの新しいバージョンには、計算列が含まれるようになりました。これらの計算列にはインデックスを付けることができます。
text_field_not_null
したがって、テーブルに、と呼ばれる可能性のある計算列とpeople
、その列のインデックスを追加できます。
ALTER TABLE people add column text_field_not_null INT
AS (IF(text_field IS NULL,0,1)) STORED;
CREATE INDEX text_field_not_null_dex ON people(text_field_not_null);
次に、このクエリはその新しいインデックスを利用します。
SELECT COUNT(*) FROM people WHERE text_field_not_null = 1;
そして、この新しい列の値は自動的に処理されます。
(MySQLは、この点で高価なテーブルサーバーにほぼ追いついています。)
Mysqlは「古い缶」であるため、インデックス付けとトリガーを使用してBOOLEAN型の補助フィールドを追加する必要がありました。
IF NEW.text_field='' THEN
SET NEW.boolean_field = 1;
ELSE
SET NEW.boolean_field = 0;
END IF
このクエリを使用します
select count(*) from people where text_field not like "";
幸運を!
このタイプのクエリを使用してください
text_fieldがNULLでない人からcount(*)を選択します。
パフォーマンスを向上させるために、フィルター句を追加してください