2

私は大規模なmysqlデータベース(500万行)を持っており、データは電話番号です。私は多くの解決策を試しましたが、それでも遅いです。現在、INT type and LIKE sql query店舗や電話番号の検索に使用しています。例:SELECT phonenumber FROM tbl_phone WHERE phonenumber LIKE '%4567' 170 ** 4567 **、249 ** 4567 **、..などの電話番号を検索する場合

私はそれをより速く実行させるソリューションが必要です。お願い助けて!

4

4 に答える 4

1

数値をINTとして格納していますが、CHARとしてクエリを実行すると(LIKE演算子は暗黙的にINTをCHARに変換します)、それは確かに最適ではありません。数値をINT(おそらくIOパフォーマンスサームの最良のアイデア)として保持したい場合は、数値比較を使用するようにクエリを変更することをお勧めします。

-- instead of CHAR operators 
WHERE phone_number LIKE '%4567'
WHERE phone_number LIKE '1234%'
-- use NUMERIC operators
WHERE phone_number % 10000 = 4567
WHERE phone_number >= 12340000 -- considering 8 digit numbers

データを保存およびクエリするための同種の方法を選択することに加えて、適切なインデックスを作成することを覚えておく必要がありますCREATE INDEX IDX0 ON table (phone_number);

残念ながら、それでも@ronと同様の効果がコメントされているため、クエリは最適ではない可能性があります。この場合、この列をより管理しやすい列(national_code、area_code、phone_numberなど)に分割するためにテーブルを調整する必要がある場合があります。これにより、たとえば市外局番によるインデックス効率の高いクエリが可能になります。

于 2012-08-09T17:00:41.667 に答える
0

ここでアドバイスを確認してくださいSELECTを高速化する方法..複数の列でのMySQLのLIKEクエリ?

それが役に立てば幸い!

于 2012-08-09T16:35:05.227 に答える
0

次の例のようにでREGEXPはなく、を使用して実験します。LIKE

SELECT `field` WHERE `field` REGEXP '[0-9]';

それ以外に、電話検索パターンの一部の長さが一定の場合は、実際にインデックスを作成します。

MySQLパターン数学ドキュメントへのリンクもあります。

于 2012-08-09T16:37:07.333 に答える
0

そのLIKE述語は文字列で動作しているため、INTからVARCHARへの暗黙の変換が発生します。つまり、先頭に文字が含まれるLIKE述語であっても、INT列のインデックスは役に立たないということです。(述語はsargableではありません。)

電話番号の最後の桁を検索している場合、そのようなものを高速にする唯一の方法は、別のVARCHAR列を追加し、その中に逆の電話番号を格納することです。数字の後ろ向きです。

そのVARCHAR列にインデックスを作成し、「4567」で終わる電話番号を検索します。

WHERE reverse_phone LIKE '7654%'

-また-

WHERE reverse_phone LIKE CONCAT(REVERSE('4567'),'%')
于 2012-08-09T16:43:05.483 に答える