Mysqlあいまいマッチングクエリの最適化
Mysql Fuzzy Matching Query Optimization
MySQLは、likeステートメントよりも効率的です。位置を見つけるinstrfind_in_set
内部関数instrを使用します。これは、従来のlikeメソッドを置き換え、より高速です。
Instr関数、最初のパラメーターはフィールド、2番目のパラメーターは照会する文字列、文字列の位置が返されます。最初のパラメーターは1で、見つからない場合は0です。
例えば、
tpl_userから名前を選択します。ここで1とinstr(name
、 ’jack’)
名前にジャックを使用して名前を照会できます。
LIKEステートメント
SELECT column
FROM table
ここでcondition
`%keyword% 'のように
実際、代わりに2つの関数locate(position)とinstrを使用できます。
まず、LOCATEステートメント
SELECT column
table
からここで、locate( ‘keyword’、condition
)> 0
第二に、またはロケートのエイリアス
POSITIONステートメント
SELECT column
table
からwhere position( ‘keyword’ IN condition
)
第三に、INSTRステートメント
SELECT column
table
からここで、instr(condition
、 ‘keyword’)> 0
Locate、position、instrの違いはパラメータの位置のみであり、位置は開始位置のパラメータと同じです。
mysql> SELECT LOCATE( ‘bar’、 ‘foobarbar’、5)
テスト結果の例は同じです。
SELECT b.id,a.cname,a.factory,a.description,a.detail,b.spec,b.sale_price from t_goods_spu a INNER JOIN t_goods_sku b on a.id = b.spu WHERE a.cname LIKE '% Ginkgo%' SELECT b.id,a.cname,a.factory,a.description,a.detail,b.spec,b.sale_price from t_goods_spu a INNER JOIN t_goods_sku b on a.id = b.spu WHERE position('Ginkgo' IN A.cname) SELECT b.id, a.cname, a.factory, a.description, a.detail, b.spec, b.sale_price from t_goods_spu a INNER JOIN t_goods_sku b on a.id = b.spu WHERE locate('Ginkgo', A.cname) SELECT b.id, a.cname, a.factory, a.description, a.detail, b.spec, b.sale_price from t_goods_spu a INNER JOIN t_goods_sku b on a.id = b.spu WHERE INSTR( a.cname, 'ginkgo')