1. 先关闭mysql缓存,避免影响sql真实查询效果
show variables like '%query_cache_%';
- query_cache_size 为缓存查询结果分配的内存的数量。默认值是0,即禁用查询缓存。
请注意即使query_cache_type设置为0也将分配此数量的内存。
要想防止query_cache_size的值运行时超过32MB,使用选项--maximum-query_cache_size=32M。 - query_cache_type 设置查询缓存类型0 1 2 (OFF ON DEMAND)
#variables系统变量,global 全局生效
#临时的直接执行
set global query_cache_size=0;
set global query_cache_type=0;
#永久的修改配置文件my.cnf ,添加下面的配置即可。
query_cache_type=0
query_cache_size=0
- 查看缓存命中情况 , Qcache_hits 数值的变化
show STATUS like '%qcache%';
2. 以pay_bill 查询支付流水表分页为例子
2.1 查看索引,先把索引删除(主键会自动生成唯一索引)。观察在无索引状态下查询速度
#查看表索引
show index from pay_bill;
- 删除索引
#DROP INDEX <索引名> ON <表名>
DROP INDEX index_transDate ON pay_bill;
2.2 在Navicat里面测试感觉不准确,所以在项目里面,用jmeter压测。xml 如下
2.3 jmeter 10个并发,循环5次。数据40w,offset=1, pageSize=200
从结果来看,V2接口平均用时比V1接口要快。V1接口平均用时2938,V2接口平均用时2455
2.4 jmeter 10个并发,循环5次。数据40w,offset=400000, pageSize=200
从结果来看,V2接口平均用时比V1接口要快,limit分页越往后面查询速度会越慢。V1接口平均用时7505,V2接口平均用时2556.值得一提的是V2的中位数1696明显变快。
2.5 增加transDate 索引
ALTER TABLE pay_bill ADD INDEX index_transDate ( transDate
);
受影响的行: 0
时间: 10.689s
# 创建脚本
# 1.PRIMARY KEY(主键索引)
ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
# UNIQUE(唯一索引)
ALTER TABLE `table_name` ADD UNIQUE (`column` )
# INDEX(普通索引)
ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
# FULLTEXT(全文索引)
ALTER TABLE `table_name` ADD FULLTEXT ( `column` )
# 多列索引(联合所以),支持column1 | column1,column2| column1,column2,column3 3种组合进行查找
ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
2.6 jmeter 10个并发,循环5次。数据40w,offset=400000, pageSize=200
对比2.4,V1接口没有明显变化,但是V2速度提高了一倍。V1接口平均用时7349,V2接口平均用时1212
2.7 数据库版本,表数据大小
select version();
10.1.22-MariaDB
#查看指定库的指定表的大小
select
table_schema as '数据库',
sum(table_rows) as '记录数',
sum(truncate(data_length/1024/1024, 2)) as '数据容量(MB)',
sum(truncate(index_length/1024/1024, 2)) as '索引容量(MB)'
from information_schema.tables
where table_schema='pay' and table_name='pay_bill'
注意:
对于大量数据深度分页查询慢是不可避免的。对于这类处理
- 忽略总数,根据上一页下一页思想,例如,百度查询,es查询
- 对于不变数据,建立排序字段。更具区间筛选,例如每页10条,查第2页 >20 <30