概述
当向Mysql服务器发送查询请求时,MySQl执行过程如下:
1、客户端发送一个连接请求给服务器。
2、服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果,否则进入下一阶段。(如果是更新sql,会把之前的查询缓存置为失效状态)
3、服务器端进行SQL解析、预处理(是否语法错误,关键字等)。
4、查询优化器对查询进行优化并生成对应的执行计划(索引选择等)。
5、MySQL根据优化器生成的执行计划,再调用存储引擎的API来执行查询。
(查询缓存生成redo日志undo日志,
执行引擎写binlog,提交事务)
6、将结果返回给客户端。
mysql执行计划:
解析:该sql涉及三个表,dau表上命中PRIMARY(主键)索引,扫描行数1,
darc命中dig_user_id_index(自建普通索引)索引,darc2同darc,其中rows是mysql做查询时预估的扫描数量,理论上数量越少越好,我们要做的就是减少该值!
查询缓存需要手动开启:
在配置文件中加上(query_cache_type=1或query_cache_type=on)
例如:vi /etc/mysql/mysql.conf.d/mysqld.cnf,然后重启mysql(service mysql restart)
查询缓存是否开启(show variables like ‘%query%’; )
测试是否生效:
第一次查询时间:2.83s
第二次查询:0s
参数说明:
query_cache_type:是否打开查询缓存。可以设置为OFF、ON和DEMAND。DEMAND表示只有在查询语句中明确写明SQL_CACHE的语句才会放入查询缓存。
query_cache_size:查询缓存使用的总内存空间。
query_cache_min_res_unit:在查询缓存中分配内存块时的最小单元。较小的该值可以减少碎片导致的内存空间浪费,但是会导致更频繁的内存块操作。
query_cache_limit:MySQL能够查询的最大查询结果。如果查询结果大于这个值,则不会被缓存。因为查询缓存在数据生成的时候就开始尝试缓存数据,所以当结果全部返回后,MySQL才知道查询结果是否超出限制。超出之后,才会将结果从查询缓存中删除。