mysql+百万+中间表_MYSQL优化

MYSQL优化是一个非常大的课题,这篇文章主要介绍了跟MYSQL相关的4个方面,如果想深入研究可以查下相关资料。

一、服务器级别优化

二、操作系统级别优化

三、MYSQL级别优化

四、SQL级别优化

一、服务器级别优化

1.服务器选型

SUN小型机、DELL730xd、HPDL380、IBM3850、云服务等

2. CPU个数、内存大小

大内存,高IO,是现代基于web的数据库的必备

3.磁盘:SAS、SSD、FIO卡

减小寻道时间、旋转时间、传输时间

4. RAID卡电池,RAID级别

WriteBack, ReadAheadNone,Direct,NoWrite Cache if Bad BBU

5.其他:网卡等

二、操作系统级别优化

1. I/O调度策略

NOOP、CFQ、Deadline、Anticipatory

临时生效:echo “dadline” >/sys/block/sda/queue/scheduler

永久生效:/etc/grub.conf中kernel后加elevator=deadline(需要重启)

2. SWAP使用策略

echo"vm.swappiness=10">>/etc/sysctl.conf

https://www.percona.com/blog/2014/04/28/oom-relation-vm-swappiness0-new-kernel/

3.文件系统

ext3、ext4还是使用xfs

4.避免NUMA问题

numactl --interleave=all即是允许所有的处理器可以交叉访问所有的内存

5. /tmp分区

tmpfs  /dev/shm  tmpfs  defaults  00

设置tmpdir=/tmp之后,某些习惯性把文件写到tmp下的人要改一改习惯了,因为这些文件占用的是内存不是磁盘,而且如果不重启的话是一直占用

6. CPU

关闭服务器的节能模式

查看kondemand进程运行情况:

ps -ef |grepkondemand

三、MYSQL级别优化

1.版本的选择,除官方版本外

a413a9ce7ee964433ecc2fcf563b8c93.png2.   最重要的参数选项调整

default-storage-engine=innodb

innodb_buffer_pool_size、key_buffer_size

innodb_flush_log_at_trx_commit、sync_binlog

innodb_file_per_table

long_query_time

max_connection

3. Schema设计规范及SQL使用

设计自增列做主键

字段属性尽量都加上NOT NULL约束

尽可能不使用TEXT/BLOB类型

多表联接查询时,结果集小的作为驱动表

复合索引的选择

4.其他建议(pt-toolkit、orzdba等工具使用)

pt-duplicate-key-checker检查并删除重复的索引

pt-index-usage检查并删除使用频率很低的索引

pt-query-digest进行慢查询分析

pt-kill杀掉超长时间的SQL请求

pt-online-schema-change来完成大表的ONLINE DDL需求

pt-table-checksum、pt-table-sync来检查并修复mysql主从复制的数据差异

四、Sql级别优化

案例一:URL列索引优化

T_VIDEO表的SQL操作缓慢,出现性能问题,抓取慢查询,发现主要由大量如下类似的SQL语句执行缓慢:

select … … (这里是表的所有字段)

fromT_VIDEO video0_  where        video0_.VIDEO_PATH=‘http://www.youtube.com/watch?v=ZjxzF3fNQuI‘limit 1;

咨询开发同学,这个是为了确认某条数据是否已经存在,需要查询全部字段并逐一比较。并且表中只有ID列主键,无其他索引。

那么如何缓解这种情况呢?如何确认某条数据是否存在?

制定方案:

1)通过“主键(或者唯一约束)”来判断该行数据是否存在,存在的话直接覆盖更新。

2)坚决不建议逐个字段查询出来一一比较!因为首先,查询语句执行时的Sending Data的时间会加长,当数据量达到一定程度的时候还会产生大量的临时表;其次需要消耗CPU和时间来做比较,性价比不高。

存在问题:

1)存储的URL前n位基本相同或者只有几种,其次URL可能会很长;

2)如果还是使用传统的B-tree索引的话,索引会变得非常大且效率不高

解决方案:

1)大家知道hash索引性能要比B-tree索引好,且基于数字类型的索引性能要比基于字符串的索引好,那么如果我们将URL做一个hash然后在这个hash值上做索引,查询的时候将URL和hash作为where条件,既实现了基于索引的查询,又降低了索引的大小。

2)我们可以使用CRC32函数来实现。

在数据库中建立冗余列URL_CRC,用于存储URL的hash值,这里在插入的时候使用CRC32(“……”)函数,返回值是数字类型

3)在这一列上建立索引

查询的时候使用WHEREURL_CRC=CRC32(“……”)  AND URL=”……”,查询优化器会自动使用索引列URL_CRC,即使有重复值,还可以通过URL列二次筛选

案例二:百万级数据分页

项目中数据量已经动辄百万,且会使用到分页。

开发同学在代码中进行分页一般会这么写:

select *from `table` order by iddesc limit 1000000,50;

可是当数据量到达百万、千万或者更多的时候,很可能会出现分页查询性能下降明显的情况,可能从之前的毫秒到现在的几秒或者几十秒。这是为什么呢?

select * from `table` order by id desc limit100,50;         0.016秒

select * from `table` order by id desc limit1000,50;       0.047秒

select * from `table` order by id desc limit10000,50;      0.094秒

select *from `table` order by iddesc limit 100000,50;    0.43秒

select *from `table` order by iddesc limit 1000000,50;  2.23秒

其实limit在实际执行的时候是“查询1000050行数据,然后丢掉前面的1000000行,返回剩下的50行”,是不是发现了很惊悚的问题了呢?! 浪费了大量的I/O性能啊。

如何优化?

代码级:

程序里维护一个变量,用于记录当前要显示的页的数据起始值,SQL语句中使用这个变量的值;

数据库级(SQL级)

利用覆盖索引

selectid fromFROM `tablle`  order by id desclimit 1000000,50;

或者

SELECT* FROM`table` WHERE id <= (SELECT id FROM `table` ORDER BY id desc LIMIT1000000,1) ORDER BY id desc LIMIT 50;

或者

select* FROM`table` AS t1 JOIN (SELECT id FROM `table` ORDER BY id desc LIMIT1000000,1) ASt2 WHERE t1.id<=t2.id order by t1.id desc limit 50;

原理就是记录住当前页id的最大值和最小值,计算跳转页面和当前页相对偏移,由于页面相近,这个偏移量不会很大,这样的话大大减少扫描的行数。

或者

select* from`table` where id between 1000001 and 1000050;

原理和上面类似,直接定位需要扫描的数据(页),但是如果这个跨度区间内的ID有缺失,那么查询出的数据就小于50条了,这一点一定要注意。

案例三:使用简单SQL去完成复杂功能

原来的执行脚本:

INSERTINTOT_APP_APK_ID_DOWNLOAD

(APK_ID,APP_UPDATE_TIME,DOWNLOAD_NUM)

selecta.APK_ID,a.UPDATE_TIME,IFNULL(b.TOTAL_NUM,0)

from

(selectMAX(id)id,max(UPDATE_TIME) UPDATE_TIME,APK_ID from T_APP GROUP BY APK_ID) as a

LEFTJOIN

T_APP_DOWNLOAD_STATIbon a.id=b.APP_ID;

4000W数据,所需时间15min+

简化SQL语句的重要方法就是采用临时表暂存中间结果,但是,临时表的好处远远不止这些,将临时结果暂存在临时表,后面的查询就在temptable中了,这可以避免程序中多次扫描主表,也大大减少了程序执行中“共享锁”阻塞“更新锁”,减少了阻塞,提高了并发性能。

分拆后执行计划步骤:

1.建立中间表

CREATETABLE `T_APP_TMP` (

`ID`int(11) NOT NULL AUTO_INCREMENTCOMMENT ‘主键‘,

`APP_ID`int(11) NOT NULL DEFAULT‘0‘ COMMENT ‘APK 唯一标识‘,

`UPDATE_TIME`datetime NOT NULLDEFAULT ‘2000-01-01 00:00:00‘ COMMENT ‘APK更新时间‘,

`APK_ID`varchar(150) NOT NULLDEFAULT ‘‘ COMMENT ‘APK 唯一标识‘,

PRIMARY KEY (`ID`),

KEY`idx_app_appid_code` (`APP_ID`)

)ENGINE=InnoDBAUTO_INCREMENT=1DEFAULT CHARSET=utf8 COMMENT=‘应用表‘;

2.将数据插入中间表

INSERTINTOT_APP_TMP(APP_ID,UPDATE_TIME,APK_ID) select MAX(id)id,max(UPDATE_TIME)UPDATE_TIME,APK_ID from T_APP GROUP BY APK_ID;

3.将最终结果插入结果表

INSERT INTOT_APP_APK_ID_DOWNLOAD (APK_ID,APP_UPDATE_TIME,DOWNLOAD_NUM)

selecta.APK_ID,a.UPDATE_TIME,IFNULL(b.TOTAL_NUM,0)

fromT_APP_TMP as a LEFT JOINT_APP_DOWNLOAD_STATI b

ona.APP_ID=b.APP_ID;

4.将中间表删除

DROP TABLET_APP_TMP;

按照这个步骤执行,总共不超过5min钟。

原文:http://www.cnblogs.com/zengkefu/p/5835491.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/529683.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java kafka 拉取_java获取kafka consumer lag

maven依赖org.apache.kafkakafka-clients0.10.1.0注意&#xff1a;kafka-clients版本需要0.10.1.0以上&#xff0c;因为调用了新增接口endOffsets;laglogsize-offsetlogsize通过consumer的endOffsets接口获得&#xff1b;offset通过consumer的committed接口获得&#xff1b;imp…

java开源图像处理ku_83 项开源视觉 SLAM 方案够你用了吗?

原标题&#xff1a;83 项开源视觉 SLAM 方案够你用了吗&#xff1f;公众号&#xff1a;3D视觉工坊主要关注&#xff1a;3D视觉算法、SLAM、vSLAM、计算机视觉、深度学习、自动驾驶、图像处理以及技术干货分享运营者和嘉宾介绍&#xff1a;运营者来自国内一线大厂的算法工程师&a…

java 方法的拆分_java – 字符串拆分和比较 – 最快的方法

>将输入读入byte []数组以将指针保持在代码的一侧.>逐字节读取,计算整数元素&#xff1a;int b inputBytes[p];int d b - 0;if (0 < d) {if (d < 9) {element element * 10 d;} else {// b :}} else {// b ,// add element to the hash; element 0;...}if (…

java sql异常_java.sql.SQLException: Io 异常: Got minus one from a

java.sql.SQLException: Io 异常: Got minus one from a read callat oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:111)at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:145)at oracle.jdbc.driver.DatabaseError.thro…

java 拦截器ajax_(转)拦截器深入实践 - JAVA XML JAVASCRIPT AJAX CSS - BlogJava

Interceptor的定义我们来看一下Interceptor的接口的定义&#xff1a;Java代码 publicinterfaceInterceptorextendsSerializable {/*** Called to let an interceptor clean up any resources it has allocated.*/voiddestroy();/*** Called after an interceptor is created, b…

php学的是什么意思_为什么要学习PHP?到底什么是PHP?

为什么要学习PHP?到底什么是PHP?PHP可以做什么?相信这样的问题困扰着很多的人&#xff0c;在我没工作之前&#xff0c;都没有听说过PHP&#xff0c;自从工作后&#xff0c;慢慢接触到代码&#xff0c;慢慢知道什么是PHP。PHP是做网站一种语言&#xff0c;很多工程师都使用PH…

php 多数据库联合查询,php如何同时连接多个数据库_PHP教程

下面是一个函数能够保证连接多个数据库的下不同的表的函数&#xff0c;可以收藏一下&#xff0c;比较实用&#xff0c;测试过是有用的。function mysql_oper($oper,$db,$table,$where1,$limit10){$connmysql_connect(localhost,like,admin,true) or mysql_error();mysql_select…

java判断有没有修改,java字节码判断对象应用是否被修改

原创1 背景在学习并发的时候看到了ConcurrentLinkedQueue队列的源码&#xff0c;刚开始的时候是看网上的帖子&#xff0c;然后就到IDE里边看源码&#xff0c;发现offer()方法在1.7版的时候有过修改。楼主的问题不是整个方法&#xff0c;而是其中的一截代码“(t ! (t tail))”&…

php接口 含义,php晋级必备:一文读懂php接口特点和使用!

PHP接口与类是什么关系&#xff1f;前面提到了php中抽象类和抽象方法&#xff0c;今天给大家谈谈php中接口技术。在PHP中每个类只能继承一个父类&#xff0c;如果声明的新类继承了抽象类实现了以后&#xff0c;这个新类就不能有其它的父类了。但是在实际中需要继承多个类实现功…

php获取不重复的随机数字,php如何生成不重复的随机数字

【摘要】PHP即“超文本预处理器”&#xff0c;是一种通用开源脚本语言。PHP是在服务器端执行的脚本语言&#xff0c;与C语言类似&#xff0c;是常用的网站编程语言。PHP独特的语法混合了C、Java、Perl以及 PHP 自创的语法。下面是php如何生成不重复的随机数字&#xff0c;让我们…

java 素数乘积,求助2424379123 = 两个素数的乘积,求这两个素数?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼import java.util.ArrayList;import java.util.Date;public class Test {static ArrayList list new ArrayList();/*** 初始化素数表* return*/public static ArrayList initArrayList() {list.add(2);list.add(3);list.add(5);li…

php header什么意思,php header是什么意思

header函数在PHP中是发送一些头部信息的, 我们可以直接使用它来做301跳转等&#xff0c;下面我来总结关于header函数用法与一些常用见问题解决方法。发送一个原始 HTTP 标头[Http Header]到客户端。标头 (header) 是服务器以 HTTP 协义传 HTML 资料到浏览器前所送出的字串&…

matlab dct稀疏系数,Matlab DCT详解

转自&#xff1a;http://blog.csdn.net/ahafg/article/details/48808443DCT变换DCT又称离散余弦变换&#xff0c;是一种块变换方式&#xff0c;只使用余弦函数来表达信号&#xff0c;与傅里叶变换紧密相关。常用于图像数据的压缩&#xff0c;通过将图像分成大小相等(一般为8*8)…

matlab验潮站,验潮站的作用是什么

验潮站的作用是什么?验潮站的建成投入使用&#xff0c;可实时观测沿海潮汐等观测要素&#xff0c;为潮汐预报、赤潮的发生、风暴潮预警报、海啸预警及海平面变化提供基础数据保障以及预测&#xff0c;同时为科学开发海洋提供有力的支持&#xff0c;为海洋经济健康发展保驾护航…

答题闯关php,成语答题闯关红包流量主小程序源码

修复红包页面提现提示文字得叠的问题限制过关红包每天领取个数左侧影响美观的小程序链接的文字去掉了增加版本号没有问题的可以暂不更新此版本修复前一版本客服提现没有授权的问题管理后台增加主动推送客服消息(红包)给用户的功能&#xff0c;唤醒用户使用自定义分享的配置增加…

php是音频吗,只要是用PHP和JS发布的HTML5是否可以播放音频?

我正在尝试创建一个可以上传播客的页面。我想拥有“发布”或“取消发布”的能力。我让每个播客添加到一个数据库中,包含它的信息和发布列,可以是真是假。目前我使用以下代码PHP:if(isPublished()){header(Cache-Control: max-age100000);header(Content-Transfer-Encoding: bin…

php收购,php中文网收购全国用户量最大的phpstudy集成开发环境揭秘

phpstudy介绍2008年第一个版本诞生&#xff0c;至今已有&#xff19;年,该程序包集成最新的ApachePHPMySQLphpMyAdminZendOptimizer,一次性安装,无须配置即可使用,是非常方便、好用的PHP调试环境.该程序不仅包括PHP调试环境,还包括了开发工具、开发手册等.总之学习PHP只需一个包…

复杂电网三相短路计算的matlab仿真,复杂电网三相短路计算的MATLAB仿真电力系统分析课设报告 - 图文...

XG?XT**35.3100??0.11003000.856100???0.05100120发电厂B&#xff1a;XG?XT**17.65100 ??0.051003000.853100???0.025100120发电厂H&#xff1a;XG?XT**17.65100??0.051003000.8512100???0.1100120变电站C&#xff1a;3.6100*XT???0.03100120 线路&#x…

php 将多个数组 相同的键重组,PHP – 合并两个类似于array_combine但具有重复键的数组...

你可以使用array_map&#xff1a;$arrKeys array(str, str, otherStr);$arrVals array(1.22, 1.99, 5.17);function foo($key, $val) {return array($key>$val);}$arrResult array_map(foo, $arrKeys, $arrVals);print_r($arrResult);Array([0] > Array([str] > 1.…

C php反序列化,php反序列化漏洞 - anansec的个人空间 - OSCHINA - 中文开源技术交流社区...

反序列化本身是没有漏洞的&#xff0c;但是当反序列化和一些魔术方法结合使用时就可能会产生安全风险。常用的魔术方法__wakeup反序列化漏洞示例(__wekeup)class A{var $test "demo";function __wakeup(){eval($this->test);}}$b new A();$c serialize($b);$a …