MySQLおよびSQLite-述語の正規表現

正規表現は、SQLクエリで慎重に使用すると、非常に貴重なサービスを提供できます。

カーソルサイクルを並べ替える必要がなくなります(アプリケーションの基本言語のサイクルでは、堅固なテーブルの断片)。 確かに、サービスは「弱気」になることがあります。

この手法の適用例と特徴



たとえば、最初の段階でユーザーがデータベースに任意のレコードを作成し、2番目の段階でこの任意のレコードを外部キーとして使用できるビジネスレスアプリケーションロジックがあります。

タスクは非常に予測可能です-レコードの一意性を観察する必要があります。

そのような解決策を検討するために提案することができます(はい、それは普遍的ではありません。なぜなら、私は任意のユーザー記録を補足し、それによって正式にそれを変更するからです。 )

DDLテーブル

CREATE TABLE `human_link` (

`translit_link` varchar (255) NOT NULL DEFAULT 'main' ,

`owner` int NOT NULL ,

PRIMARY KEY (`translit_link`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8




* This source code was highlighted with Source Code Highlighter .






議論中の任意のエントリが「translit_link」フィールドである場合、一意性を維持するために、数値(1)を追加するか、すでに数値がある場合は、数値を+1増やします。

そのような記録があるかどうかを調べるには、リクエストすることができます

SELECT `translit_link` FROM `foo`.`human_link`

WHERE `translit_link` REGEXP CONCAT( '^' ,?, '[[:digit:]]*$' ) ORDER BY `translit_link` DESC LIMIT 1;




* This source code was highlighted with Source Code Highlighter .






実際には、私たちに戻ってきたものを理解し、フィールドの一意性を維持するロジックが私たちに教えてくれることを返すことを理解することだけが残っています(より近いアプローチは、perlとストアドプロシージャを使用するこのテクニックの例です-私のブログで読んでください)。

しかし、それはすべてただのことわざでした。

物語はこれです-このクエリに関するEXPLAIN MySqlは、 Using where; Using index



Using where; Using index



が、DBDからSQLiteを使用する場合:: SQLiteコンポーネント-

REGEXP関数

正規表現のマッチングではSQLiteインデックスは使用されませんが、すべての行で繰り返されるため、パフォーマンスの点で非常にコストがかかることに注意してください。



さらに、MySQLでは、すべてがそれほどスムーズではありません。 「高性能MySQL:最適化、バックアップ、レプリケーション、および負荷分散」という本では、 Jeremy D. Zawodny、Derek J. BallingがWHERE last_name RLIKEと言う行があります(son | ith)$ "理解可能な理由で非現実的に遅くなりますが、WHERE rev_last_name RLIKEのような式^(thi | nos)" WHERE rev_last_nameのような2つのユニオンよりも遅くなります "thi%"および "nos%" オプティマイザーは正規表現ベースのクエリを最適化しようとしません

ここから、すべてのヨーグルトが同じように役立つわけではないと結論付けます。



PS。 PostgreSQL、Oracle、MSキャンプの状況についてのヒントに非常に感謝します。 :)

PPS ON DUPLICATE KEY UPDATEの存在を認識しています。複数の一意のインデックスを使用すると、プロシージャが正しく動作しません。 つまり 理論的には、ビジネスロジックにとって一般的に安全ではありません。 作成されたインデックスに暗黙的な制限を課します。



All Articles