我需要帮助设置所有MySQL变量以及任何人可能拥有的任何建议。
我们目前有1台服务器:
MySQL设置为:
复制正在努力。奴隶的想法是处理许多连接
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
以上对4个从属中的每一个都是相同的,只是将“3302”改为3303,3304和3305。
我们有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
EXPLAIN:
'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'
EXPLAIN:
'1', 'SIMPLE', 'kwp', 'range', 'PRIMARY,id_kw', 'PRIMARY', '8', NULL, '55071', 'Using where; Using index; Using temporary; Using filesort'`
这是 30到60秒,这是我遇到问题的地方。该查询返回产品ID列表,其中包含列表中首先出现最多关键字的产品。
然后我使用从上面生成的列表从产品表中获取具有上述ID的产品。
我的问题是,有没有办法通过优化查询或调整配置文件设置来使此查询更快地运行。所有的设置都被猜到了,在这个阶段我们只能在1台物理服务器上运行它。
如果您需要更多信息,请与我们联系。
答案 0 :(得分:1)
您需要创建复合索引id_kw + id_prod
。
重要:只要id_kw + id_prod
索引的左侧部分包含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, ...)