我在InnodDB中有5个表,它们有大约4千万条记录
我想为所有表格搜索contact_id创建简单的过滤器。
为此,我创建了以下查询:
SELECT c.id FROM contacts AS c
JOIN bonus_cards AS B USING(client_id)
JOIN orders AS o USING(card_number)
JOIN order_items AS oi USING (order_id)
JOIN products AS p USING (product_id) WHERE p.brand_id = 125;
我还使用了不同的查询样式:
SELECT c.id FROM contacts AS c
INNER JOIN bonus_cards AS bc ON(bc.client_id=c.client_id)
INNER JOIN orders AS o ON(bc.card_number=o.card_number)
INNER JOIN order_items AS oi ON(o.order_id=oi.order_id)
INNER JOIN products AS p ON(oi.product_id=p.product_id) WHERE p.brand_id = 125;
时间没有区别。
请求很长。而且很长一段时间都超过30分钟。
我有所有必要的索引,当我进行查询查询时,我看到索引都参与其中。
我的配置my.cnf:
net_read_timeout = 3600
net_write_timeout = 3600
wait_timeout = 120
interactive_timeout = 120
key_buffer_size =32M
sort_buffer_size = 8M
max_allowed_packet = 1M
read_rnd_buffer_size = 1M
thread_stack = 128K
query_cache_limit = 1M
query_cache_size = 0
query_cache_type = 1
thread_cache_size = 16
max_heap_table_size = 128M
tmp_table_size = 128M
innodb_open_files = 4096
innodb_file_per_table = 1
innodb_flush_method=O_DIRECT
innodb_flush_log_at_trx_commit=0
innodb_log_file_size = 128M
innodb_log_buffer_size = 16M
innodb_buffer_pool_size=2048M
innodb_buffer_pool_instances=1
#innodb_additional_mem_pool_size = 16M
innodb_thread_concurrency = 16
innodb_read_io_threads = 8
innodb_write_io_threads = 8
innodb_stats_on_metadata = 0
innodb_data_file_path=ibdata1:10M:autoextend
答案 0 :(得分:0)
对于此查询:
SELECT c.id
FROM contacts AS c JOIN
bonus_cards AS B USING(client_id) JOIN
orders AS o USING(card_number) JOIN
order_items AS oi USING (order_id) JOIn
products AS p USING (product_id)
WHERE p.brand_id = 125;
最佳指标是:
products(brand_id, product_id)
order_items(product_id, order_id)
orders(order_id, card_number)
bonus_cards(card_number, client_id)
contacts(client_id, id)
那就是说,我很惊讶您必须通过bonus_cards
这样的表来与订单联系。
答案 1 :(得分:0)
我在db结构中发现了bug。我正在使用我收到的数据库,并且我的完整性没有任何变化。
但这句话 - 从不相信数据,结果证明是真的。数据库不是链接子表的正确数据类型。
例如:
contacts - client_id int 8 not null, bonus_cards - client_id int 8 not null, bonus_cards - card_number varchar 56 not null, orders - card_number varchar 56 not null, orders - order_id int 11 not null, order_items order_id **varchar 50** not null, order_items product_id **varchar 50** not null, products product_id int 8 not null, products brand_id int 8 not null,
我可能还有一个例子,可能来自开发人员。 首先,在调试查询时,请检查数据类型。
我希望我帮助社区。 p>
P.S。查询执行速度5s(8.2Gb数据库和2GB RAM):)简单