怎样做触屏版手机网站,慕课联盟网站开发实战,ppt设计倒计时,大英做网站MYSQL优化是一个非常大的课题#xff0c;这篇文章主要介绍了跟MYSQL相关的4个方面#xff0c;如果想深入研究可以查下相关资料。一、服务器级别优化二、操作系统级别优化三、MYSQL级别优化四、SQL级别优化一、服务器级别优化1.服务器选型SUN小型机、DELL730xd、HPDL380、IBM3…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 BBU5.其他网卡等二、操作系统级别优化1. I/O调度策略NOOP、CFQ、Deadline、Anticipatory临时生效echo “dadline” /sys/block/sda/queue/scheduler永久生效/etc/grub.conf中kernel后加elevatordeadline(需要重启)2. SWAP使用策略echovm.swappiness10/etc/sysctl.confhttps://www.percona.com/blog/2014/04/28/oom-relation-vm-swappiness0-new-kernel/3.文件系统ext3、ext4还是使用xfs4.避免NUMA问题numactl --interleaveall即是允许所有的处理器可以交叉访问所有的内存5. /tmp分区tmpfs /dev/shm tmpfs defaults 00设置tmpdir/tmp之后某些习惯性把文件写到tmp下的人要改一改习惯了因为这些文件占用的是内存不是磁盘而且如果不重启的话是一直占用6. CPU关闭服务器的节能模式查看kondemand进程运行情况ps -ef |grepkondemand三、MYSQL级别优化1.版本的选择除官方版本外2. 最重要的参数选项调整default-storage-engineinnodbinnodb_buffer_pool_size、key_buffer_sizeinnodb_flush_log_at_trx_commit、sync_binloginnodb_file_per_tablelong_query_timemax_connection3. 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?vZjxzF3fNQuI‘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_CRCCRC32(“……”) 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* FROMtable WHERE id (SELECT id FROM table ORDER BY id desc LIMIT1000000,1) ORDER BY id desc LIMIT 50;或者select* FROMtable AS t1 JOIN (SELECT id FROM table ORDER BY id desc LIMIT1000000,1) ASt2 WHERE t1.idt2.id order by t1.id desc limit 50;原理就是记录住当前页id的最大值和最小值计算跳转页面和当前页相对偏移由于页面相近这个偏移量不会很大这样的话大大减少扫描的行数。或者select* fromtable 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 aLEFTJOINT_APP_DOWNLOAD_STATIbon a.idb.APP_ID;4000W数据所需时间15min简化SQL语句的重要方法就是采用临时表暂存中间结果但是临时表的好处远远不止这些将临时结果暂存在临时表后面的查询就在temptable中了这可以避免程序中多次扫描主表也大大减少了程序执行中“共享锁”阻塞“更新锁”减少了阻塞提高了并发性能。分拆后执行计划步骤1.建立中间表CREATETABLE T_APP_TMP (IDint(11) NOT NULL AUTO_INCREMENTCOMMENT ‘主键‘,APP_IDint(11) NOT NULL DEFAULT‘0‘ COMMENT ‘APK 唯一标识‘,UPDATE_TIMEdatetime NOT NULLDEFAULT ‘2000-01-01 00:00:00‘ COMMENT ‘APK更新时间‘,APK_IDvarchar(150) NOT NULLDEFAULT ‘‘ COMMENT ‘APK 唯一标识‘,PRIMARY KEY (ID),KEYidx_app_appid_code (APP_ID))ENGINEInnoDBAUTO_INCREMENT1DEFAULT CHARSETutf8 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 bona.APP_IDb.APP_ID;4.将中间表删除DROP TABLET_APP_TMP;按照这个步骤执行总共不超过5min钟。原文http://www.cnblogs.com/zengkefu/p/5835491.html