特定のVARCHAR列に数値(数値に変換可能)がある行の数を取得したいMySqlテーブルがあります。現在、このフィールドで簡単なREGEXPチェックを行っています。このテーブルは非常に大きいため、REGEXPへの一連のインデックスをできるだけ少ない行で使用しています。
ただし、このVARCHAR列にもインデックスが付けられます。さらに少ない行をスキャンするために利用できるMySqlインデックス作成アルゴリズムの巧妙なハックはありますか?:-/これはInnoDBテーブルです。
特定のVARCHAR列に数値(数値に変換可能)がある行の数を取得したいMySqlテーブルがあります。現在、このフィールドで簡単なREGEXPチェックを行っています。このテーブルは非常に大きいため、REGEXPへの一連のインデックスをできるだけ少ない行で使用しています。
ただし、このVARCHAR列にもインデックスが付けられます。さらに少ない行をスキャンするために利用できるMySqlインデックス作成アルゴリズムの巧妙なハックはありますか?:-/これはInnoDBテーブルです。
おそらくすでに回避しようとしているので、これは気に入らないかもしれませんが、このような状況が発生した場合は、巧妙なトリックを試みるのではなく、varchar を数値列に格納する追加の列を追加します (を使用して更新されます)。トリガー)、それに対するクエリ。
しかし、私が見ることができる方法があります (本番環境でこれを行う理由はありませんでしたが)。これは、インデックス作成によって値が順番に並べられるという事実を利用して、すべてが数字で始まるようにすることです。一緒に配列されます。
次のようなテーブルを想定します。
CREATE TABLE `test_1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`text_or_number` varchar(255),
PRIMARY KEY (`id`),
KEY `test_1_idx` (`text_or_number`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
utf8 文字の順序を利用して、数字で始まる値のみを選択できます - http://en.wikipedia.org/wiki/UTF-8#Examples
utf-8 の 0 の前の最小値は「/」であり、その後の最大値は「:」であるため、これは数字で始まる値のみを抽出する必要があります。
select cast(text_or_number as unsigned)
from test_1
where text_or_number < ':'
and text_or_number > '/'
and cast(text_or_number as unsigned) > 0;
それにはまだ数字で始まる値が含まれる可能性がありますが、数字で終わらないため、cast(...) > 0 句を追加しましたが、mysql は where 句を順番に実行するのに十分スマートになると思います、うまくいけば、数値文字で始まる行のサブセットでのみキャストを実行します。