請問 select(1) 和 select(*) 有什么區別
-
selelct 常量 from ...對應所有行,回傳的永遠只有一個值,即常量,所以正常只會用來判斷是否有還是沒有,比如 exists 子句, -
select * from ...是回傳所有行的所有列, 性能上的差異,關鍵看 from 和 where 子句,比如說 where 條件中可以使用索引,那顯然select 1 from ...的性能比select * from ...好,
說一下 count(1) 和 count(*) 的區別
count(*) 包括了所有的列,相當于行數,在統計結果的時候,不會忽略為 NULL 的值,
count(1) 包括了忽略所有列,用 1 代表代碼行,在統計結果的時候,不會忽略為 NULL 的值,
count(列名) 只包括列名那一列,在統計結果的時候,會忽略列值為空的計數,即某個欄位值為 NULL 時,不統計,這里的空不是指空字串或者 0,而是表示 null,
執行效率上:
-
列名為主鍵,
count(列名)會比count(1)快; -
列名不為主鍵,
count(1)會比count(列名)快; -
如果表多個列并且沒有主鍵,則
count(1)的執行效率優于count(*); -
如果有主鍵,則
select count(主鍵)的執行效率是最優的; -
如果表只有一個欄位,則
select count(*)最優,
說一下 B-Tree 索引
B-Tree 能加快資料的訪問速度,因為存盤引擎不再需要進行全表掃描來獲取資料,資料分布在各個節點之中,
在 MySQL 中不同存盤引擎使用 B-Tree 索引的方式不盡相同,同樣會影響資料庫的性能,比如 MyISAM 引擎使用一種“前綴壓縮”的技術,這樣可以索引更小,并且 MyISAM 索引是通過索引到具體物理地址找到資料行的,而 InnoDB 引擎則在索引中保留了未壓縮的值,InnoDB 是通過主鍵值來索引到資料行的,這兩種方式各有優缺點,
B-Tree 索引之所以能夠加快資料訪問速度,主要是因為存盤引擎在訪問要查找的資料時不需要進行全表掃描,它是從 B-Tree 的根節點開始的,根節點的槽保存著指向子節點的指標,存盤引擎會跟隨這些指標,然后通過查看節點頁中的值從而找到正確指標,這個指標定義了其子節點中值得上限和下限,最終結果為存盤引擎沒有查找到期望的值,或者成功到達葉子頁,
查詢型別可以使用 B-Tree 索引
B-Tree 索引在根據完整鍵值、鍵范圍或者鍵前綴查找時性能比較好,這些只有在使用索引的最左前綴時有效(最左索引可能是 MySQL 的特列),下面這幾種型別查詢使用前面說的索引是很有用的:
1、匹配全值,一個全鍵值匹配索引中所有列的指定值,也就是根據索引列的值來匹配,
2、匹配最左前綴,只根據索引最左列值查找,
3、匹配某一列的前綴,即根據索引列的值的前綴查找,這種情況只能使用到索引第一列的情景,
4、匹配值區間,即根據索引某一列值范圍查找,也只能是索引列第一列,
5、匹配一部分精確值,一部分范圍值,比如我索引有兩列 A、B,可以根據 A 列的精確值,B 列的范圍值進行查詢,
6、僅索引查詢,B-Tree 索引支持僅索引查詢,這種情況只會訪問本身,而不會訪問行存盤,
因為樹的節點是有序排列的,因此可以用來根據(查找值)查找和 order by 查詢(有序方式查找值),通常來說,如果一個 B-Tree 可以通過某種特定方式查找某一行,它也可以按相同條件對行進行排序,所以索引對滿足上面列出查找型別的 order by 子句很有幫助,
B-Tree 的一些限制
1、不滿足最左索引的查找是沒有用的,比如索引是 A 、B 列,但是查詢條件是 where B = "b",
2、不能跳過索引中的列,比如索引還是 A 、B 列,但是查詢條件是 A = "a" and C ="c" 這種明顯是不行的,
3、存盤引擎無法對第一個范圍查找右側的列訪問進行優化,比如索引列是 A、B、C 三列,而查詢是 select * from table where A = "a" and B like "b" and C = "c",這種情況下索引訪問只會訪問前兩列,因為 like 也是一個范圍查詢,
B-Tree 索引作為最常用的索引型別,它通過以有序方式對資料進行排序運行,這樣 MySQL 就可以利用諸如 order by、group by 這樣查詢陳述句,因為資料是已經排好序的,B-Tree 索引可以將資料關聯存盤在一起,最后就是,索引本身實際上保存了資料值副本,因此某些情況下只通過索引就能滿足查詢結果,
JDBC API 的 PreparedStatement 相比 Statement 的好處
大多數時候都使用 PreparedStatement 代替 Statement,
1、PreparedStatement 是預編譯的,比 Statement 速度快;
2、PreparedStatement 代碼的可讀性和可維護性更好,雖然用 PreparedStatement 來代替 Statement 會使代碼多出幾行,但這樣的代碼無論從可讀性還是可維護性上來說,都比直接用 Statement 的代碼高很多檔次:
// Statement
stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");
// preparedStatement
perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)");
perstmt.setString(1,var1);
perstmt.setString(2,var2);
perstmt.setString(3,var3);
perstmt.setString(4,var4);
perstmt.executeUpdate();
3、安全性,PreparedStatement 可以防止 SQL 注入攻擊,而 Statement 卻不能,比如說:
String sql = "select * from tb_name where name= '"+varname+"' and passwd='"+varpasswd+"'";
// 如果把 [' or '1' = '1] 作為 varpasswd 傳入進來,用戶名 xx,看看會成為什么?
select * from tb_name where name = 'xx' and passwd = '' or '1' = '1';
// 因為 '1'='1' 肯定成立,所以可以任何通過驗證,更有甚者:
// 把 [';drop table tb_name;] 作為 varpasswd 傳入進來,則:
select * from tb_name where name = '隨意' and passwd = '';drop table tb_name;
// 有些資料庫是不會成功的,但也有很多資料庫就可以使這些陳述句得到執行,
// 而如果使用預編譯陳述句傳入的任何內容就不會和原來的陳述句發生任何匹配的關系,
// 只要全使用預編譯陳述句就用不著對傳入的資料做任何過慮,
// 而如果使用普通的 statement,有可能要對 drop 等做費盡心機的判斷和過慮,
JDBC API 中的 execute,executeQuery,executeUpdate 的區別是什么?
Statement 的 execute(String query) 方法用來執行任意的 SQL 查詢,如果查詢的結果是一個 ResultSet,這個方法就回傳 true,如果結果不是 ResultSet,比如 insert 或者 update 查詢,它就會回傳 false,可以通過它的 getResultSet 方法來獲取 ResultSet,或者通過 getUpdateCount() 方法來獲取更新的記錄條數,
Statement 的 executeQuery(String query) 介面用來執行 select 查詢,并且回傳 ResultSet,即使查詢不到記錄回傳的 ResultSet 也不會為 null,通常使用 executeQuery 來執行查詢陳述句,這樣的話如果傳進來的是 insert 或者 update 陳述句的話,它會拋出錯誤資訊為 executeQuery method can not be used for update 的 java.util.SQLException,
Statement 的 executeUpdate(String query) 方法用來執行 insert 或者 update/delete DML 陳述句,或者什么也不回傳 DDL 陳述句,回傳值是 int 型別,如果是 DML 陳述句的話,它就是更新的條數,如果是 DDL 的話,就回傳 0,
只有不確定是什么陳述句的時候才應該使用 execute() 方法,否則應該使用 executeQuery 或者 executeUpdate 方法,
JavaScript 中的 == 和 === 的不同
== 只比較值,=== 比較值和資料型別,
AJAX 的優缺點都有什么?
優點:
1)頁面無重繪,用戶的體驗非常好,
2)使用異步方式與服務器通信,具有更加迅速的回應能力,
3)可以把以前一些服務器負擔的作業轉嫁到客戶端,利用客戶端閑置的能力來處理,減輕服務器和帶寬的負擔,節約空間和寬帶租用成本,并且減輕服務器的負擔,AJAX 的原則是“按需取資料”,可以最大程度的減少冗余請求,和回應對服務器造成的負擔,
4)基于標準化的并被廣泛支持的技術,不需要下載插件或者小程式,
缺點:
1)不支持瀏覽器 back 按鈕,
2)安全問題,AJAX 暴露了與服務器互動的細節,
3)對搜索引擎的支持比較弱,
4)破壞了程式的例外機制,
5)不容易除錯,
請簡要說明 String.valueOf 和 (String) 以及 toString 的區別
-
(String)強制型別轉換,要注意的是型別必須能轉成 String 型別, -
toString字串型別轉換,要注意,必須保證 object 不是 null 值,否則將拋出NullPointerException例外, -
String.valueof()當轉入的變數為null時,不會報錯,
反射機制的優缺點?
靜態編譯 - 在編譯時確定型別、系結物件即通過,
動態編譯 - 在運行時確定型別、系結物件,動態編譯最大限度發揮了 Java 的靈活性,體現了多型的應用,有以降低類之間的藕合性,
優點: 可以實作動態創建物件和編譯,體現出很大的靈活性,特別是在 J2EE 的開發中,它的靈活性就表現的十分明顯,
缺點: 對性能有影響,使用反射基本上是一種解釋操作,可以告訴 JVM,希望做什么并且它滿足對應的要求,這類操作總是慢于只直接執行相同的操作,
什么是 JDBC 連接,在 Java 中如何創建一個 JDBC 連接?
JDBC 的全稱是 Java DataBase Connection,也就是 Java 資料庫連接,可以用它來操作關系型資料庫,JDBC 介面及相關類在 java.sql 包和 javax.sql 包里,可以用它來連接資料庫,執行 SQL 查詢,存盤程序,并處理回傳的結果,
創建 JDBC 連接:
1、加載 JDBC 驅動程式,
2、提供 JDBC 連接的 URL,
3、創建資料庫的連接,
4、創建一個 Statement,
5、執行 SQL 陳述句,
6、處理結果,
7、關閉 JDBC 物件,
想了解更多,歡迎關注我的微信公眾號:Renda_Zhang
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/208445.html
標籤:其他
