路徑不同,使用命令不同。
創(chuàng)新互聯(lián)是一家專注網(wǎng)站建設(shè)、網(wǎng)絡(luò)營(yíng)銷策劃、微信小程序定制開(kāi)發(fā)、電子商務(wù)建設(shè)、網(wǎng)絡(luò)推廣、移動(dòng)互聯(lián)開(kāi)發(fā)、研究、服務(wù)為一體的技術(shù)型公司。公司成立10年以來(lái),已經(jīng)為上千工商代辦各業(yè)的企業(yè)公司提供互聯(lián)網(wǎng)服務(wù)?,F(xiàn)在,服務(wù)的上千客戶與我們一路同行,見(jiàn)證我們的成長(zhǎng);未來(lái),我們一起分享成功的喜悅。
1、5.7版本的mysql驅(qū)動(dòng)路徑是5.7的驅(qū)動(dòng)包,8.0以上是8的驅(qū)動(dòng)包。
2、8.0以上的mysql版本驅(qū)動(dòng)時(shí)使用命令中的pwd需要去掉,而5.7版本的保留IDENTIFIEDBYpwd。
原因是你的Mysql的驅(qū)動(dòng)包沒(méi)有被加載,由于你是在cmd下用java命令來(lái)執(zhí)行的,所以沒(méi)有掛載jar包,正確的方法如下: java -cp xx.jar MainClass其中xx.jar就是你的mysql的驅(qū)動(dòng)jar包,MainClass就是你要執(zhí)行的java類 寫(xiě)程序是個(gè)體力活
1,下載JDBC驅(qū)動(dòng)程序mysql-connector-java-3.1.13.zip,解壓在合適的目錄下面!
我的是D:\mysql-jdbc
2,設(shè)置環(huán)境變量,即在classpath的值里加上:D:\mysql-jdbc\mysql-connector-java-3.1.13-bin.jar;
現(xiàn)在java程序已經(jīng)可以訪問(wèn)數(shù)據(jù)庫(kù)了!測(cè)試代碼如下:
import java.sql.*;
public class sqlConn
{
public static void main(String[] args)
{
System.out.println("MySQL connection test");
Connection con = null;
Statement stat = null;
String urlstr = "jdbc:mysql://localhost:3306/try";
String user = "root";
String password = "413026";
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection(urlstr, user, password);
stat = con.createStatement();
stat.executeUpdate("insert into new_table(id) values(1);
ResultSet rs = stat.executeQuery("select * from new_table");
while (rs.next())
System.out.println("id:"+rs.getString("id"));
rs.close();
System.out.println("Test ends");
}
}
為了讓數(shù)據(jù)庫(kù)可以讓JSP程序使用做第三步。
3,將解壓后的文件夾中的mysql-connector-java-3.1.13-bin.jar復(fù)制到
D:\Tomcat\common\lib
D:\Tomcat\shared\lib
即Tomcat的安裝目錄下面。
1. 下載jdbc 的驅(qū)動(dòng) mysql-connector-java-5.1.41-bin.jar,并將該驅(qū)動(dòng)放到路徑:
D:\apache-jmeter-3.0\lib\
2. 打開(kāi)Jmeter 工具,添加線程組 ,如圖所示:
3. 在Jmeter工具中,添加JDBC Connection Configuration ,如圖所示:
4.添加JDBC Request ,如圖所示:
5. 添加 查看結(jié)果樹(shù),如圖所示:
6.配置 JDBC Connection Configuration ,如圖所示:
7.配置JDBC Request 處,添加需要使用的sql語(yǔ)句,如圖所示:
8.將已經(jīng)下載的jdbc驅(qū)動(dòng)加載到Jmeter工具中,這樣就使得mysql與Jmeter連接起來(lái)。如圖所示:
選擇 測(cè)試計(jì)劃 —? 進(jìn)入頁(yè)面,點(diǎn)擊 瀏覽按鈕,如圖所示:
9.點(diǎn)擊 綠色的 運(yùn)行按鈕,執(zhí)行結(jié)果,如圖所示:
眾所周知, MySQL的驅(qū)動(dòng)表與被驅(qū)動(dòng)表是優(yōu)化器自動(dòng)優(yōu)化選擇的結(jié)果 (與表連接的前后順序等無(wú)關(guān)),我們可以用explain執(zhí)行計(jì)劃來(lái)知曉:
如上所示,前面一行t1是驅(qū)動(dòng)表,后面一行t2是被驅(qū)動(dòng)表。那么驅(qū)動(dòng)表與被驅(qū)動(dòng)表的選擇是否有規(guī)律可循呢?下面是百度搜索兩個(gè)主流的博文對(duì)驅(qū)動(dòng)表與被驅(qū)動(dòng)表的闡釋:
1. MySQL連接查詢驅(qū)動(dòng)表被驅(qū)動(dòng)表以及性能優(yōu)化 - 阿偉~ - 博客園 博文A 主要結(jié)論:
2. mysql驅(qū)動(dòng)表與被驅(qū)動(dòng)表及join優(yōu)化_java小小小黑的博客-CSDN博客_mysql驅(qū)動(dòng)表和被驅(qū)動(dòng)表 博文B 其主要結(jié)論:
兩個(gè)帖子的結(jié)論是都差不多,而且還給出了例子來(lái)佐證。那么網(wǎng)上的結(jié)論是否權(quán)威?是否有普遍性?是否存在缺陷?
讓我們來(lái)一起打破砂鍋問(wèn)到底。下面有兩張表結(jié)構(gòu)一模一樣的表t1,t2:其中t1 100條數(shù)據(jù),t2 1000條數(shù)據(jù);t1(t2)結(jié)構(gòu)如下:
按照上面博文的結(jié)論,left join左邊是t2表,應(yīng)該是驅(qū)動(dòng)表。我們查看下結(jié)果:
與 博文B 中觀點(diǎn)1相違背(同理觀點(diǎn)2也違背),與實(shí)際不符,但究竟這是為什么呢?
下面發(fā)一張MySQL的執(zhí)行過(guò)程(來(lái)源于《MySQL實(shí)戰(zhàn)45講》中01講【一條SQL查詢語(yǔ)句是如何執(zhí)行的】)
so die si ne,原來(lái)sql執(zhí)行的過(guò)程是這樣呀。等等,不對(duì),這跟剛才SQL又有什么關(guān)系,上面left join中t2表還是左邊的呀。
我們知道MySQL高版本的性能越來(lái)越好,它是不斷進(jìn)行優(yōu)化迭代的。遠(yuǎn)古的mysql版本可能還需要人工把小表放在前面,大表放在后面等這些需要人工調(diào)優(yōu)的經(jīng)驗(yàn)早就已經(jīng)被解決了。也就是說(shuō)我們寫(xiě)的語(yǔ)句,MySQL為了追求更好的效率,它在執(zhí)行器執(zhí)行前已經(jīng)幫我們優(yōu)化了。那么實(shí)際優(yōu)化后的sql如何查看呢?用show warning命令:
其中Message就是優(yōu)化后實(shí)際執(zhí)行的sql語(yǔ)句,格式化后如下:
優(yōu)化后left join左連接變成了內(nèi)連接(inner) join。所以用優(yōu)化后的sql看,表t1是小表所以作為驅(qū)動(dòng)表,與實(shí)際結(jié)果相符。
left join 竟然優(yōu)化成了join,太神奇了,但這是為什么呢?原因在于mysql中null與任何值做等值或者不等值比較的時(shí)候都是null,即使是select null=null 也是null。這樣where 條件t1.a=t2.a查詢條件不會(huì)包含t2.a為NULL的行,實(shí)際效果其實(shí)跟join一樣,被優(yōu)化器智能的優(yōu)化了。
我們直接看執(zhí)行計(jì)劃看實(shí)際結(jié)果吧:
結(jié)果顯示t2是驅(qū)動(dòng)表,t1是被驅(qū)動(dòng)表。t2是1000條數(shù)據(jù)按理說(shuō)是大表應(yīng)該是被驅(qū)動(dòng)表,與 博文A , 博文B 的結(jié)論又不一致了。
《MySQL實(shí)戰(zhàn)45講》中34講【到底可不可以使用join】已經(jīng)講的很透徹了,很深入了,我就不在這里獻(xiàn)丑了。啰嗦幾句大概就是驅(qū)動(dòng)表是全表掃描不走索引,所以選被驅(qū)動(dòng)表t1可以走索引,不會(huì)全表掃描,減少IO次數(shù),性能高。里面對(duì)大表小表的總結(jié),簡(jiǎn)直是精髓,特意在此再次著重強(qiáng)調(diào):
在決定哪個(gè)表做驅(qū)動(dòng)表的時(shí)候,應(yīng)該是兩個(gè)表按照各自的條件過(guò)濾,過(guò)濾完成之后,計(jì)算參與join的各個(gè)字段的總數(shù)據(jù)量,數(shù)據(jù)量小的那個(gè)表,就是“小表”,應(yīng)該作為驅(qū)動(dòng)表。
按照上面分析,我們先獨(dú)立思考下MySQL會(huì)選擇哪張表作為驅(qū)動(dòng)表呢?
表t1,t2在字段a上都有索引不會(huì)全表掃描,其中t1.a=5條件過(guò)濾后只有一條,很顯然嘛,t1數(shù)據(jù)量少是小表,肯定是驅(qū)動(dòng)表,錯(cuò)不了,再說(shuō)了前面的紅色粗體已經(jīng)強(qiáng)調(diào)了,不會(huì)有錯(cuò)的。
有冇搞錯(cuò)?事實(shí)又被打臉了。還記得在開(kāi)篇我們說(shuō)過(guò)的mysql優(yōu)化器會(huì)對(duì)sql語(yǔ)句進(jìn)行優(yōu)化的嗎?下面我們看下執(zhí)行計(jì)劃與優(yōu)化的sql語(yǔ)句:
格式化后的優(yōu)化SQL如下:
優(yōu)化后兩表t1,t2都走索引,并且都只有一條結(jié)果返回,因此都只會(huì)掃描一行,數(shù)據(jù)量一樣,所以誰(shuí)在前面誰(shuí)就是驅(qū)動(dòng)表,也就是上面sql中表t2。一切都釋然,豁然開(kāi)通!
回頭再仔細(xì)想想,高,實(shí)在是高!仔細(xì)深思之后MySQL優(yōu)化后的句子真讓人猛拍大腿。高明之處在于:
1. 本來(lái)join連接是個(gè)M*N的嵌套循環(huán),優(yōu)化后變成了M+N的判斷,兩表不再嵌套判斷了。
2. 優(yōu)化后,兩表沒(méi)有多大必然聯(lián)系,只需把兩表的結(jié)果集拼接即可,互不干擾。如果mysql未來(lái)可以多線程查詢,豈不十分快哉!
小伙伴們還記得我們?cè)谏弦徽? MySQL索引初探 中編碼類型不一致發(fā)生隱式轉(zhuǎn)換時(shí)有時(shí)候走索引,有時(shí)候索引又失效的問(wèn)題嗎?下面我們選取有代表性的一條記錄來(lái)分析:
其中表demo_test總共有640條數(shù)據(jù),demo_test_ass有3條數(shù)據(jù)。顯然經(jīng)過(guò)過(guò)濾條件t.rid1完成后demo_test_ass數(shù)據(jù)量小,應(yīng)該作為驅(qū)動(dòng)表。雖然test.c_utf8mb4 = t.c2兩字段連接中發(fā)生了t.c2字段發(fā)生隱式轉(zhuǎn)換,但是實(shí)際上并不影響被驅(qū)動(dòng)表test上的c_utf8mb4索引。
好了,本章到此結(jié)束,讓我們一起 總結(jié)一下MySQL驅(qū)動(dòng)表與被驅(qū)動(dòng)表的選取原則 :
?? ? 同等條件,優(yōu)先選取有索引的表作為被驅(qū)動(dòng)表。 在此介紹一下什么叫同等條件,比如上面的②中的語(yǔ)句。 兩表沒(méi)有其他額外的過(guò)濾條件,因此選關(guān)聯(lián)字段有索引的t1作為被驅(qū)動(dòng)表。但是如果加了條件(and t1.id=3),此時(shí)t1數(shù)據(jù)量少,就選取了t2作為被驅(qū)動(dòng)表。
??? MySQL選擇驅(qū)動(dòng)表與被驅(qū)動(dòng)表是基于優(yōu)化器優(yōu)化后的,小表是驅(qū)動(dòng)表,大表是被驅(qū)動(dòng)表。 基于優(yōu)化器優(yōu)化后開(kāi)篇的 博文A與B 結(jié)論成立。
當(dāng)然這都是我一家之言,并不是官方結(jié)論,目前暫未找到官方確切對(duì)于驅(qū)動(dòng)表與被驅(qū)動(dòng)表的解釋,請(qǐng)大家踴躍拍磚!
1,首先寫(xiě)個(gè)方法package util;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;public class DBUtil { static String jdbcURL = "jdbc:mysql://localhost:3306/book";
static String jdbcDriver = "com.mysql.jdbc.Driver";
static String userName = "root";
static String password = "root";
/**
* 獲取數(shù)據(jù)庫(kù)連接對(duì)象
* @return 數(shù)據(jù)庫(kù)連接對(duì)象
* @throws ClassNotFoundException
* @throws SQLException
*/
public static Connection getConnection() throws ClassNotFoundException,
SQLException {
Class.forName(jdbcDriver);
return DriverManager.getConnection(jdbcURL, userName, password);
}
} 2。項(xiàng)目名==右鍵==build path==add external archivers.... 選擇你mysql驅(qū)動(dòng) 添加進(jìn)去就ok了