任何人都可以帮我优化此查询并帮助我调整my.cnf文件吗?
SELECT
rf_row_id,
pf_id,
pf_wordpress_url,
pf_merchant_logo,
rf_desc,
rf_manufacturer,
rf_product_name,
rf_small_image,
rf_price,
pf_name,
rf_shipping_handling_cost,
pf_voucher_code_expiry_date,
pf_voucher_code,
pf_voucher_code_instructions,
rf_last_modified,
pf_last_update,
rf_deep_link,
pf_delivery_free_from,
pf_voucher_code_url,
pf_delivery_string,
pf_delivery_fee_2
FROM raw_feed, product_feeds
WHERE pf_id=rf_feed_id
AND ( rf_search_index LIKE '%C4838AE%' OR rf_search_index LIKE '%HP11%')
GROUP BY rf_feed_id, rf_product_id ORDER BY rf_price ASC
重新启动服务器并且查询不在chache中后执行大约需要5秒。 我有索引: table product_feeds到pf_id(主)列 表raw_feed到rf_row_id(主要)和rf_search_index列
在EXPLAIN之后我得到:
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: raw_feed
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 263804
Extra: Using where; Using temporary; Using filesort
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: product_feeds
type: eq_ref
possible_keys: PRIMARY
key: PRIMARY
key_len: 2
ref: usrdb_rnbx.raw_feed.rf_feed_id
rows: 1
Extra:
不知道为什么第一行的密钥为空?!我应该创建哪些索引?
我在raw_feed表中总共有263,804行,在product_feeds表中有50行。
MY.CNF文件:()
[mysqld]
basedir=/opt/bitnami/mysql
character-set-server=UTF8
collation-server=utf8_general_ci
datadir=/opt/bitnami/mysql/data
port=3306
socket=/opt/bitnami/mysql/tmp/mysql.sock
tmpdir=/opt/bitnami/mysql/tmp
set-variable = max_connections=3096
set-variable = max_allowed_packet=15M
key_buffer = 1024M
key_buffer_size = 1024M
table_cache = 1024
sort_buffer_size = 50M
read_buffer_size = 50M
read_rnd_buffer_size = 16M
myisam_sort_buffer_size = 3M
thread_cache = 32
thread_concurrency = 16
open-files-limit= 261424
set-variable = thread_stack=512k
set-variable = query_cache_size=128M
set-variable = wait_timeout=120
set-variable = interactive_timeout=60
set-variable = max_connect_errors=999999
有人可以帮我重新配置这个文件并帮我查询吗?
我使用amazon aws ec2小实例,10GB根存储,1.7GB(RAM?)内存
由于
答案 0 :(得分:2)
LIKE
不能在MySQL中使用索引。这是因为MySQL需要知道字符串的 start 才能在其索引中查找(这是MySQL如何处理索引,实际上是大多数数据库产品的限制)。所以,最好的MySQL可以做的就是扫描raw_feed
- 这正是它的作用。
您需要找到另一种方法来进行搜索。一种选择是(假设你正在使用MyISAM,这可能是你的my.cnf)内置的全文搜索。另一个例如是Sphinx。
另外,你的my.cnf设置很奇怪(很想说“疯狂”)。对于具有1.7G RAM的系统,key_buffer
是大型的。但是,在Serverfault上最好问一下MySQL调优。
答案 1 :(得分:0)
你的raw_feed表应该在rf_feed_id上有一个索引来优化你的product_feeds表的连接...没有它,它基本上试图强制一个动态的索引来匹配JOIN条件,更不用说LIKE限定符