2

私はこのようなクエリを持っています:

select count(*) from people where text_field is not null;

遅いです。ミディアムテキストフィールドにインデックスを付けるのはコーシャですか?これのベストプラクティスは何ですか?

4

4 に答える 4

8

この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は、この点で高価なテーブルサーバーにほぼ追いついています。)

于 2012-08-21T03:26:35.750 に答える
0

Mysqlは「古い缶」であるため、インデックス付けとトリガーを使用してBOOLEAN型の補助フィールドを追加する必要がありました。

IF NEW.text_field='' THEN 
SET NEW.boolean_field = 1;
ELSE
SET NEW.boolean_field = 0;
END IF
于 2019-04-11T03:54:11.453 に答える
-3

このクエリを使用します

   select count(*) from people where text_field not like "";

幸運を!

于 2014-04-17T10:18:46.157 に答える
-3

このタイプのクエリを使用してください

text_fieldがNULLでない人からcount(*)を選択します。

パフォーマンスを向上させるために、フィルター句を追加してください

于 2019-04-11T04:23:40.170 に答える