
Mysql之性能优化浅析
发布日期:2021-05-27 02:54:27
浏览次数:4
分类:技术文章
本文共 2039 字,大约阅读时间需要 6 分钟。
现在,越来越多的项目中数据库采用mysql,在数据量上来后就会遇到海量数据的查询速度慢的问题。
举个栗子,mysql数据库,student表,主键自增,在select分页查询时,查询前几页速度很快,如 limit 100,10;但数据量很大,查询后面的页时就会越来越慢,
如,select * from student where name = '曹操' order by no limit 1000 000,10; 查询慢时因为limit后面的 偏移量 太大所致,需要先扫描出1000 000条(100w)数据,然后丢弃前面的大部分数据,只返回10条数据。
数据模拟方法:
创建表drop table if EXISTS student;create table student( id int unsigned primary key auto_increment, no mediumint unsigned not null default 0, name varchar(20) not null default "", mgr mediumint unsigned not null default 0, hiredate datetime not null);产生随机字符串的函数DELIMITER $drop FUNCTION if EXISTS rand_string;CREATE FUNCTION rand_string(n INT) RETURNS VARCHAR(255)BEGIN DECLARE chars_str VARCHAR(100) DEFAULT 'abcdefghijklmlopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; DECLARE return_str VARCHAR(255) DEFAULT ''; DECLARE i INT DEFAULT 0; WHILE i < n DO SET return_str = CONCAT(return_str,SUBSTRING(chars_str,FLOOR(1+RAND()*52),1)); SET i = i+1; END WHILE; RETURN return_str;END $DELIMITER;建立存储过程:往表中插入数据DELIMITER $drop PROCEDURE if EXISTS insert_student;CREATE PROCEDURE insert_student(IN START INT(10),IN max_num INT(10))BEGIN DECLARE i INT DEFAULT 0; /*set autocommit =0 把autocommit设置成0,把默认提交关闭*/ SET autocommit = 0; REPEAT SET i = i + 1; INSERT INTO student(no,name,mgr,hiredate) VALUES ((START+i),rand_string(6),0001,now()); UNTIL i = max_num END REPEAT; COMMIT;END $DELIMITER;/*插入500W条数据*/call insert_student(0,5000000);建立关键字段的索引:排序、条件CREATE INDEX idx_student_id ON student(id);CREATE INDEX idx_student_no ON student(no);
数据测试:
select id,no,name,hiredate from student limit 100,10; select id,no,name,hiredate from student limit 900000,10;
优化:因为有主键id,且在上面建了索引,可以先在索引树中找到开始位置的id,然后再根据id查询
select id,no,name,hiredate from student where id >= (select id from student order by id limit 100,1) limit 10;select id,no,name,hiredate from student where id >= (select id from student order by id limit 900000,1) limit 10;
测试结果,查询速度得到提升,数据量越大越明显。
在遇到海量数据分页查询时也可以应用奖及策略,对 偏移量 进行限流,若大于某个值,就返回友情提示或空数据。
转载地址:https://blog.csdn.net/leijie0322/article/details/117218183 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
很好
[***.229.124.182]2023年11月04日 18时26分50秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
一起学Python-通过for对字典进行遍历
2019-03-25
一起学Python-长字典与类的对比
2019-03-25
一起学Python-通过python脚本进行批量telnet连通性测试
2019-03-25
解决深度deepin系统安装完成之后屏幕下半部分出现花屏的现象!
2019-03-25
Ubuntu20通过snap install很慢的解决方法
2019-03-25
MySQL、MariaDB多表联合更新语法详解
2019-03-25
crontab定时管理器使用案例
2019-03-25
VSCODE使用技巧:解决每次推送代码都要输入用户名密码的繁琐过程(非ssh)
2019-03-25
使用python爬虫把自己的CSDN文章爬取下来并保存到MD文件
2019-03-25
云计算平台常用命令
2019-03-25
OpenvSwitch帮助文档-中文版
2019-03-25
git码云的一次配置全记录
2019-03-25
git add .出错解决方法
2019-03-25
Docker部署MariaDB+PHPMyAdmin管理实战篇
2019-03-25
Windwos7/8/10-X64配置JAVA1.7环境
2019-03-25
Centos7配置静态IP地址
2019-03-25
学习Linux系统最基本的指令或单词汇总
2019-03-25
CRT连接服务器中文显示异常的解决方法
2019-03-25
Centos7配置本地yum源的方法
2019-03-25