redis value多大会影响性能_事务对MySQL性能有什么影响?有无索引查找对其影响有多大?...
推薦學(xué)習(xí)
- 阿里P8MySQL,基礎(chǔ)/索引/鎖/日志/調(diào)優(yōu)都不誤,一鍋深扒端給你
- 抖音后端123面開掛,全靠這份啃了58天的「Java進(jìn)階核心知識(shí)集」
- 肝了30天,整出這份[分布式寶典:限流+緩存+通訊],秋招跳槽有望
1、插入測(cè)試
在此次測(cè)試中數(shù)據(jù)庫(kù)表有三個(gè)字段,id(自增主鍵)、username、password。
1.1 插入耗時(shí)實(shí)測(cè)
實(shí)測(cè):
- 插入30多萬(wàn)條數(shù)據(jù),采用一次事務(wù)提交一條sql語(yǔ)句,耗時(shí)2小時(shí)以上,具體沒(méi)統(tǒng)計(jì),因?yàn)橛?jì)劃是這樣插入2000萬(wàn)條數(shù)據(jù)的,但由于太慢提前終止了,所以插入30多萬(wàn)條數(shù)據(jù)。
- 插入2000萬(wàn)條數(shù)據(jù),采用一次事務(wù)提交10萬(wàn)條sql語(yǔ)句,耗時(shí)50多分鐘,將近1小時(shí)(若是老鐵們做這樣的實(shí)驗(yàn),可以加上一個(gè)時(shí)間對(duì)象,這樣可以看的更加清晰)。
1.2 TestDemo
1.3 測(cè)試代碼:
1.3.1 MybatisTest
import mapper.TestMapper;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import po.TestBean;import java.io.IOException;import java.io.InputStream;public class MybatisTest { public static void main(String[] args) throws IOException { //1.讀取配置文件 InputStream in = Resources.getResourceAsStream("mybatis.xml"); //2.創(chuàng)建SqlSessionFactory工廠 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); SqlSessionFactory factory = builder.build(in); //3.使用工廠生產(chǎn)SqlSession對(duì)象 SqlSession session = factory.openSession(); //4.使用SqlSession創(chuàng)建Dao接口的代理對(duì)象 TestMapper testMapper = session.getMapper(TestMapper.class); //5.使用代理對(duì)象執(zhí)行方法 TestBean testBean =new TestBean(); for (int i = 10; i<20000000 ;i++){ testBean.setName("lbw"+i); testBean.setPassword("nb"+i); testMapper.saveTest(testBean);// //1次操作 提交1次事務(wù)// session.commit(); // 100000次操作提交1次事務(wù) if (i%100000 == 0){ session.commit(); } } //6.釋放資源 session.close(); in.close(); }}1.3.2 TestBean
package po;import java.io.Serializable;public class TestBean implements Serializable { String id; String name; String password; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "po.TestBean{" + "id='" + id + ''' + ", name='" + name + ''' + ", password='" + password + ''' + '}'; }}1.3.3 TestMapper
package mapper;import org.apache.ibatis.annotations.Insert;import org.apache.ibatis.annotations.Select;import po.TestBean;public interface TestMapper { @Insert("insert into test200411(name,password) values(#{name},#{password})") void saveTest(TestBean t); @Select("select id,name,password from test200411 where id = #{s}") TestBean selectById(String s);}1.3.4 mybatis.xml(mybatis配置文件)
<?xml version="1.0" encoding="UTF-8"?>1.4 過(guò)程體驗(yàn)
程序運(yùn)行后在幾個(gè)小時(shí)時(shí)間里,電腦處于烤機(jī)(烤雞誘惑,烤雞pg是塊寶)狀態(tài)!!!很遺憾的是,當(dāng)時(shí)沒(méi)有截圖程序運(yùn)行了的時(shí)間,不過(guò)1.1結(jié)論是數(shù)據(jù)是保真的,實(shí)在不想再搞幾千萬(wàn)條數(shù)據(jù)在數(shù)據(jù)庫(kù)了。
1.5 數(shù)據(jù)量
1.5.1 計(jì)數(shù)用時(shí)
使用 select count(0) from test200411 進(jìn)行計(jì)數(shù),統(tǒng)計(jì)查詢用時(shí):13.7s,得到統(tǒng)計(jì)數(shù): 20379620,之所以是20379620,是因?yàn)槲覝y(cè)試中先插入30多萬(wàn),之后再插入2000萬(wàn)。數(shù)據(jù)是不會(huì)騙人的哦,沒(méi)毛病吧,鐵子們。
1.5.2 占用硬盤空間
- 硬盤空間占用為:1.47GB(1585455597 B)。
- 分析一下,我的表字段只有3個(gè),且每個(gè)字段里面實(shí)質(zhì)存儲(chǔ)的數(shù)據(jù)長(zhǎng)度都不長(zhǎng)。151585455597 B / 20379620 = 77 B
這樣算下每一行數(shù)據(jù)平均占用77B,這個(gè)數(shù)據(jù)一看就知道,存儲(chǔ)過(guò)程中應(yīng)該是有數(shù)據(jù)壓縮的,這一結(jié)論不太嚴(yán)謹(jǐn),有大佬知道m(xù)ysql底層存儲(chǔ)的話,望指導(dǎo)一下。
2、索引查詢測(cè)試
2.1 索引檢測(cè)
使用 show index from test200411可以查到當(dāng)前表?yè)碛械乃饕?#xff0c;當(dāng)前只有我自己自增id的默認(rèn)索引,和我自己建立的id字段索引。
2.2 對(duì)有無(wú)索引的字段where查詢比較
2.2.1 無(wú)索引字段
使用 SELECT * from test200411 where password = "nb1234"查詢到兩條數(shù)據(jù),耗時(shí):57.9s,明顯這個(gè)查詢時(shí)間是不可取的
- 小結(jié)論:所以在大表查詢我們?yōu)槭裁葱枰捌渥⒅匦阅芰?#xff0c;平常若是做個(gè)小的測(cè)試系統(tǒng),數(shù)據(jù)量撐死幾千,查詢時(shí),根本就感覺(jué)不出時(shí)間上的差異。這也是為什么我們需要那么多數(shù)據(jù)庫(kù)優(yōu)化的策略,索引、分庫(kù)分表、主從復(fù)制、讀寫分離、緩存設(shè)計(jì)等等。
- 為什么會(huì)這么慢呢,因?yàn)樵撟侄螞](méi)有索引的話,它就需要一行一行的去做比對(duì),這樣做,不僅比對(duì)長(zhǎng),磁盤io也多。
2.2.1 有索引字段
使用:SELECT * from test200411 where id = 2566345查詢到唯一數(shù)據(jù),耗時(shí):0.133s
- 這個(gè)根據(jù)索引查詢數(shù)據(jù)的時(shí)間和無(wú)索引字段查詢時(shí)間比較,由實(shí)質(zhì)數(shù)據(jù)得到它們之間性能差了500多倍。
- 為什么索引這么快?因?yàn)樗饕讓邮莃+樹,所以索引是按照一定的大小順序來(lái)排序的,根據(jù)索引查詢,能減少磁盤io,也能減少比對(duì)次數(shù)。
2.3 建立索引
2.3.1 索引創(chuàng)建
使用:CREATE INDEX paw_index ON test200411(password)耗時(shí):156.0s
2.3.2 索引查詢
再次查看已經(jīng)索引,可以看到一個(gè)paw_index 的新索引,這就是我們剛剛創(chuàng)建的索引。
2.3.3 查詢新建立索引字段
使用 SELECT * from test200411 where password = "nb12345"耗時(shí):0.110s可以將此條sql和 2.2.1 比較 ,除了匹配的字符串不一樣(之所以用了不同的字符串,是因?yàn)閷?shí)驗(yàn)是連著做的,同一條字符串查詢,會(huì)有緩存,影響結(jié)果),其他都是一樣的。可以看到它們之前驚人的查詢速度差異,速度相差大概是500倍。
3、總結(jié)
3.1 事務(wù)對(duì)數(shù)據(jù)庫(kù)性能影響
在一個(gè)事務(wù)內(nèi)只提交一條sql和在一個(gè)事務(wù)內(nèi)提交多個(gè)sql,對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)的批量處理影響是很大的。一個(gè)事務(wù)內(nèi)提交多個(gè)sql可以提高批量數(shù)據(jù)的處理速度。
3.2 數(shù)據(jù)庫(kù)索引對(duì)數(shù)據(jù)庫(kù)查詢性能分析
通過(guò)上面的實(shí)例,我們可以看到,有無(wú)索引對(duì)數(shù)據(jù)庫(kù)查詢速度的影響是很大的,實(shí)驗(yàn)中它們速度差異可以到500倍,當(dāng)然這是取決的實(shí)驗(yàn)過(guò)程中的數(shù)據(jù)量,而我們的實(shí)驗(yàn)數(shù)據(jù)量有2000多萬(wàn)行,也正是這樣才能放大對(duì) 有無(wú)索引對(duì)數(shù)據(jù)庫(kù)查詢的影響 效果。
總之,通過(guò)這個(gè)實(shí)例不會(huì)有人還沒(méi)搞懂索引這個(gè)東西的重要性和其作用吧!不會(huì)吧?不會(huì)吧?當(dāng)然我這沒(méi)將索引的三板斧,“是什么,為什么需要,怎么做”,全列出來(lái),我覺(jué)得寫也的還行,帶有實(shí)例出發(fā),通俗易懂吧!!
這個(gè)實(shí)驗(yàn)從上到下都是可以復(fù)現(xiàn)的,代碼和過(guò)程都有,有興趣的小伙伴可以嘗試復(fù)現(xiàn)一下,讓自己對(duì)索引的理解加深。
作者: 小小卡爾
原文鏈接:https://blog.csdn.net/weixin_44185736/article/details/105454820
總結(jié)
以上是生活随笔為你收集整理的redis value多大会影响性能_事务对MySQL性能有什么影响?有无索引查找对其影响有多大?...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python throw_Python
- 下一篇: 东南大学数字信号处理实验_【鹏城实验室校