1

すべての MySQL 変数の設定と、だれかが持っている可能性のある推奨事項を設定するのに助けが必要です。

現在、サーバーは 1 台あります。

  • 4 x デュアルコア 2.4 GHz
  • 32GBのRAM
  • Windows Server 2008 Web エディション

MySQL は次のようにセットアップされます。

  • 1 台のマスター サーバー (ポート 3301)
  • 4 スレーブ (ポート 3302、3303、3304、3305)

レプリケーションはうまく機能しています。スレーブのアイデアは、多くの接続を処理することです

MySQL 構成ファイルは次のようになります。

[mysqld]  
datadir="E:\MySQL_Rep\data_3302"  
init-file="E:\MySQL_Rep\mysql-init-slave.txt"  
port=3302  
server-id=3302  
default-storage-engine=myisam  
bulk_insert_buffer_size = 512M  
join_buffer_size = 5M  
query_cache_limit = 1M  
max_connections=1510  
tmp_table_size = 18M  
skip-innodb  
low-priority-updates  
delay-key-write=ALL  
innodb_write_io_threads = 5  
innodb_read_io_threads = 10  
skip-ssl  
slave_compressed_protocol  
slave-skip-errors=all  
sync_binlog = 1  
join_buffer_size = 20M  
replicate-wild-ignore-table=db.search_result%  
key_buffer_size=4G  
expire_logs_days=1    
relay-log-space-limit=10G  
myisam-recover=backup,force  
read_rnd_buffer_size=1G  
read_buffer_size=1G  

上記は、「3302」を 3303、3304、および 3305 に変更するだけで、4 つのスレーブのそれぞれで同じです。

3 つのメイン テーブルがあります。

Name: keyword_index  
Engine: MyISAM  
Rows: 1,521,140  
Avg Row Length: 25  
Data Length: 38150952  
Index Length: 48757760  
Columns: id(INT 11), word(VARCHAR 45, UNIQUE)  

Name: keyword_prodid  
Engine: MyISAM  
Rows: 42,611,210  
Avg Row Length: 17  
Data Length: 724390570  
Index Length: 1796547584  
Columns: id_kw(BIGINT 20, INDEXED), id_prod(BIGINT 20)  

Name: products  
Engine: MyISAM  
Rows: 7,192,937  
Avg Row Length: 1018  
Data Length: 7544910024  
Index Length: 686807040  
Columns: prod_id(BIGINT 20),... ... ...  

私が実行するクエリ:

SELECT kwi.id FROM keyword_index kwi WHERE kwi.`word` = 'mobile' LIMIT 1

説明:

'1', 'SIMPLE', 'kwi', 'const', 'word_UNIQUE', 'word_UNIQUE', '137', 'const', '1', ''`  

これは明らかに 0 秒未満で実行され、5531;を返します。


上記の結果を使用して

SELECT 
    id_prod,count(*) AS count,
    @sID 
FROM keyword_prodid kwp 
WHERE kwp.id_kw = 264012 
    OR kwp.id_kw = 817869 
    OR kwp.id_kw = 5531 
    OR kwp.id_kw = 7167 
    OR kwp.id_kw = 3462 
    OR kwp.id_kw = 811564 
GROUP BY id_prod 
ORDER BY count DESC LIMIT 10 INTO OUTFILE 'THEFILE'

説明:

'1', 'SIMPLE', 'kwp', 'range', 'PRIMARY,id_kw', 'PRIMARY', '8', NULL, '55071', 'Using where; Using index; Using temporary; Using filesort'`  

これは30 秒から 60 秒で実行されます。ここで問題が発生します。このクエリは、製品 ID のリストを返し、最も多くのキーワードを持つ製品がリストの最初に表示されます。

次に、上記から生成されたリストを使用して、製品テーブルから上記の ID を持つ製品を取得します。

私の質問は、クエリを最適化するか、構成ファイルの設定を微調整することにより、このクエリをより高速に実行する方法があるかどうかです。すべての設定はほぼ推測であり、この段階では 1 つの物理サーバーでしか実行できません。

さらに情報が必要な場合はお知らせください。

4

1 に答える 1

1

複合インデックスを作成する必要がありますid_kw + id_prod

重要id_kw + id_prod: index の左側の部分に含まれている限り、もはやid_kw単一のインデックスは必要ないid_kwため、削除してください。

これも

kwp.id_kw = 264012 
OR kwp.id_kw = 817869 
OR kwp.id_kw = 5531 
OR kwp.id_kw = 7167 
OR kwp.id_kw = 3462 
OR kwp.id_kw = 811564 

次のように書くことができますid_kw IN (264012, 817869, ...)

于 2012-05-30T07:25:19.813 に答える