巧用query cache

  • 时间:
  • 浏览:0

一眼还时要看出在nick上使用了md5函数,因为user表中的索引必须使用,而全表扫描:

mysql> show variables like ‘%query%’;

+——————————+——————————————-+

| Variable_name | Value |

+——————————+——————————————-+

| ft_query_expansion_limit | 20 |

| have_query_cache | YES |

| long_query_time | 1.000000 |

| query_alloc_block_size | 8192 |

| query_cache_limit | 1048576 |

| query_cache_min_res_unit | 4096 |

| query_cache_size | 0 |

| query_cache_type | ON |

| query_cache_wlock_invalidate | OFF |

| query_prealloc_size | 8192 |

| slow_query_log | ON |

| slow_query_log_file | /home/mysql/data1003/mysql/slow_query.log |

+——————————+——————————————-+

12 rows in set (0.00 sec)

还时要看完查询不需要 调慢的返回,应用立刻恢复正常。

root@xxxx ~

# my 1003

Entry Port ==== 1003

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 41001147

Server version: 5.1.61-Alibaba-39100-log Source distribution

mysql> use cuxiaowang_db

Database changed

mysql> select * from user where md5(nick)=’3f59100f59ddf2a0d14a441610040e348f?’;

Empty set (1.32 sec)

mysql> explain select * from user where md5(nick)=’3f59100f59ddf2a0d14a441610040e348f?

+—-+————-+——-+——+—————+——+———+——+——–+————-+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+—-+————-+——-+——+—————+——+———+——+——–+————-+

| 1 | SIMPLE | user | ALL | NULL | NULL | NULL | NULL | 2561008 | Using where |

+—-+————-+——-+——+—————+——+———+——+——–+————-+

1 row in set (0.00 sec)

通常具体情况下时要用户修改应用,将应用中的md5函数去掉 ,但会 修改业务的法律土办法还时要一段时间,必须够立刻是业务恢复,而是看看数据库还有这麼或多或少的法律土办法,灵机一动,但会 该应用的场景是读多写非常少的应用,想到了query cache:

有某种具体情况很有但会 是有慢sql占用了连接池中的连接这麼释放,因为后续进来的请求迟迟获取必须连接池中的连接,因为请求报错,登录数据库排查发现如下sql出显 执行非常的慢:

并肩应用报错超出了数据库的最大连接数:max connections:

mysql> select * from user where md5(nick)=’3f59100f59ddf2a0d14a441610040e348f?

Empty set (0.00 sec)

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

收到一用户反馈其应用日志中狂报错误,获取连接超时:

PS:query cache的打开是有一定场景的,但会 query cache不要适合更新,插入,删除非常大的应用,而是打开query cache一定要慎重,笔者从前看完但会 其数据库有絮状的插入和更新的数据库打开query cache而因为整个数据库就有在等待query cache的故障:

mysql> select * from user where md5(nick)=’3f59100f59ddf2a0d14a441610040e348f’;

Empty set (1.32 sec)

mysql> Ctrl-C — exit!

Aborted

Copyright (c) 100, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

mysql> set global query_cache_size=1024*1024*32;

Query OK, 0 rows affected (0.02 sec)