mysql 设置按天分表_MySQL 优化实战记录
閱讀本文大概需要 2 分鐘。
背景
本次SQL優(yōu)化是針對(duì)javaweb中的表格查詢做的。
部分網(wǎng)絡(luò)架構(gòu)圖
業(yè)務(wù)簡(jiǎn)單說明
N個(gè)機(jī)臺(tái)將業(yè)務(wù)數(shù)據(jù)發(fā)送至服務(wù)器,服務(wù)器程序?qū)?shù)據(jù)入庫(kù)至MySQL數(shù)據(jù)庫(kù)。服務(wù)器中的javaweb程序?qū)?shù)據(jù)展示到網(wǎng)頁上供用戶查看。
原數(shù)據(jù)庫(kù)設(shè)計(jì)
1、windows單機(jī)主從分離
2、已分表分庫(kù),按年分庫(kù),按天分表
3、每張表大概20w左右的數(shù)據(jù)
原查詢效率
3天數(shù)據(jù)查詢70-80s
目標(biāo)
3-5s
業(yè)務(wù)缺陷
無法使用sql分頁,只能用java做分頁。
問題排查
前臺(tái)慢 or 后臺(tái)慢
1、如果你配置了druid,可在druid頁面中直接查看sql執(zhí)行時(shí)間和uri請(qǐng)求時(shí)間
2、在后臺(tái)代碼中用System.currentTimeMillis計(jì)算時(shí)間差。
結(jié)論 : 后臺(tái)慢,且查詢sql慢
sql有什么問題
1、sql拼接過長(zhǎng),達(dá)到了3000行,有的甚至到8000行,大多都是union all的操作,且有不必要的嵌套查詢和查詢了不必要的字段
2、利用explain查看執(zhí)行計(jì)劃,where條件中除時(shí)間外只有一個(gè)字段用到了索引
備注 : 因優(yōu)化完了,之前的sql實(shí)在找不到了,這里只能YY了。
查詢優(yōu)化
去除不必要的字段
效果沒那么明顯
去除不必要的嵌套查詢
效果沒那么明顯
分解sql
將union all的操作分解,例如(一個(gè)union all的sql也很長(zhǎng))
將如上sql分解成若干個(gè)sql去執(zhí)行,最終匯總數(shù)據(jù),最后快了20s左右。
將分解的sql異步執(zhí)行
利用java異步編程的操作,將分解的sql異步執(zhí)行并最終匯總數(shù)據(jù)。這里用到了CountDownLatch和ExecutorService,示例代碼如下:
結(jié)果又快了20-30s
優(yōu)化MySQL配置
以下是我的配置示例。加了skip-name-resolve,快了4-5s。其他配置自行斷定
根據(jù)業(yè)務(wù),再加上篩選條件
快4-5s
將where條件中除時(shí)間條件外的字段建立聯(lián)合索引
效果沒那么明顯
將where條件中索引條件使用inner join的方式去關(guān)聯(lián)
針對(duì)這條,我自身覺得很詫異。原sql,b為索引
應(yīng)該之前有union all,union all是一個(gè)一個(gè)的執(zhí)行,最后匯總的結(jié)果。修改為
結(jié)果快了3-4s
性能瓶頸
根據(jù)以上操作,3天查詢效率已經(jīng)達(dá)到了8s左右,再也快不了了。查看mysql的cpu使用率和內(nèi)存使用率都不高,到底為什么查這么慢了,3天最多才60w數(shù)據(jù),關(guān)聯(lián)的也都是一些字典表,不至于如此。繼續(xù)根據(jù)網(wǎng)上提供的資料,一系列騷操作,基本沒用,沒轍。
環(huán)境對(duì)比
因分析過sql優(yōu)化已經(jīng)ok了,試想是不是磁盤讀寫問題。將優(yōu)化過的程序,分別部署于不同的現(xiàn)場(chǎng)環(huán)境。一個(gè)有ssd,一個(gè)沒有ssd。發(fā)現(xiàn)查詢效率懸殊。用軟件檢測(cè)過發(fā)現(xiàn)ssd讀寫速度在700-800M/s,普通機(jī)械硬盤讀寫在70-80M/s。
優(yōu)化結(jié)果及結(jié)論
優(yōu)化結(jié)果:達(dá)到預(yù)期。
優(yōu)化結(jié)論:sql優(yōu)化不僅僅是對(duì)sql本身的優(yōu)化,還取決于本身硬件條件,其他應(yīng)用的影響,外加自身代碼的優(yōu)化。
小結(jié)
優(yōu)化的過程是自身的一個(gè)歷練和考驗(yàn),珍惜這種機(jī)會(huì),不做只寫業(yè)務(wù)代碼的程序員。希望以上可以有助于你的思考,不足之處望指正。
原文鏈接:
https://my.oschina.net/xiaozhutefannao/blog/2243432
·END·
程序員的成長(zhǎng)之路
路雖遠(yuǎn),行則必至
本文原發(fā)于 同名微信公眾號(hào)「程序員的成長(zhǎng)之路」,回復(fù)「1024」你懂得,給個(gè)贊唄。
總結(jié)
以上是生活随笔為你收集整理的mysql 设置按天分表_MySQL 优化实战记录的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 代理查询 mysql_查询数据库代理设置
- 下一篇: mysql dif_mysqldiff实