請確保你查詢mysql資料庫時,sql語句沒有這麼寫

2020-12-09 軟體開發領路人

資料庫索引,可以讓查詢sql語句效率更高。所以大家在寫查詢的sql語句時為了讓語句執行效率高會讓語句能命中索引,或者新建合適的索引。

可是,有時候大家會遇到像下面說的這樣的情況。

明明我sql語句where條件的欄位是符合索引,應該可以命中索引的,但是執行時卻沒有命中索引。

為什麼會這樣呢,是人性的……

額,串臺了,調回來。

要說明這個問題,大家先來比較一下下面的這兩個sql語句。

這兩個sql語句唯一的區別就是where條件中id對應的值一個加了引號,一個沒有加引號。

這樣會有什麼影響嗎?

有的朋友可能要說了,這樣的sql,我試過,一樣都能查出來正確的結果啊。

如果數據量很小時,是也許沒多大影響。

但是當數據量大的時候,就會出現上面所說的問題了,其中一個sql會因為無法命中索引,而執行非常慢。

因為如果等號左邊的欄位的數據類型和等號右邊的數據類型不一致時,就會發生隱式轉換,如此就相當於是執行函數後再進行比較,這樣就會索引失效了。

那要怎麼避免這樣的問題發生呢?

其實簡單,舉例說一下,就是如果等號左邊的欄位的數據類型是數字類型的,那等號右邊對應的值就要寫成數值類型,不要加引號變成字符串類型。如果等號左邊的欄位是字符串類型的,那等號右邊的值就一定要加引號,不要寫成數字類型。

到這裡,可能有的朋友犯難了,可是我代碼中等號右邊的值不是我寫的呀,是ORM框架賦值的(比如mybatis)。這樣的話,我要怎麼保證等號左右的數據類型一致呢?

其實ORM框架做對應賦值時,是更加對應參數的數據類型來處理的。比如mybatis,是根據對應參數在Java中的數據類型來處理賦值的。如果在Java中的數據類型是數值類型的,那賦值拼接sql時,就不會加引號,如果在Java中的數據類型是字符串類型的,那賦值拼接sql時,就會加上引號了。

現在是不是明白了。今天的內容就到這裡了。

歡迎朋友們長按點讚的小手按鈕,來個三連支持我啊。

相關焦點

  • Mysql中一條SQL查詢語句是如何執行的?
    2.查詢流程解析select * from table1 where ID=10;這條語句相信大家再熟悉不過了,下面我們就看看這一條語句在mysql中是怎麼執行的。第一步:一條sql語句要經過連接器,客戶端要和mysql建立連接。
  • 【資料庫】MySQL常見SQL語句
    -databasename - 資料庫名DROP DATABASE databasename;8、修改資料庫名alter database 舊名稱 modify name = 新名稱9、備份sql server
  • mysql常用sql語句總結
    sql的內連接、外連接和交叉連接查詢等。內連接查詢在表中存在至少一個匹配時,INNER JOIN 關鍵字返回行。FROM 子句中的表或視圖可通過內聯接或完整外部聯接按任意順序指定;但是,用左或右向外聯接指定表或視圖時,表或視圖的順序很重要。有關使用左或右向外聯接排列表的更多信息,請參見使用外聯接。聯合查詢union查詢語法:sql1 union all sql2;UNION 操作符用於合併兩個或多個 SELECT 語句的結果集。
  • 「MySQL系列」分析Sql執行時間及查詢執行計劃(附資料庫和一千萬數據)
    我們幹開發面試工作的時候,發現對資料庫的面試比重很大。說明對資料庫的知識掌握對我們程式設計師越來越重要了。接下來這篇文章我們來看看如何分析我們的sql執行效率。首先找到執行慢的sql,然後對執行慢的SQL進行分析。
  • MySQL-SQL語句執行流程
    查詢緩存:  執行查詢語句的時候,會先查詢緩存(MySQL 8.0 版本後移除,因為這個功能不太實用)。分析器:  沒有命中緩存的話,SQL 語句就會經過分析器,分析器說白了就是要先看你的 SQL 語句要幹嘛,再檢查你的 SQL 語句語法是否正確。
  • 考前複習必備MySQL資料庫(關係型資料庫管理系統)
    ;SQL基本語法學習sql語句和mysql基本數據類型,學習掌握數據插入,修改,刪除的sql語句,查詢語句,以及各類特定的查詢語句。學會資料庫事務的概念,特性以及使用方法。sql的目錄也整理一個思維導圖:
  • 提升SQL語句性能的方法
    線上mysql資料庫爆出一個慢查詢,DBA觀察發現,查詢時伺服器IO飆升,IO佔用率達到100%, 執行時間長達7s左右。優化方法:優化的總體思路是拆分sql,將排序操作和查詢所有信息的操作分開。t ON t.id = g.type_id AND t.deleted = 0 WHERE g.deleted = 0 ORDER BY g.modify_time DESC LIMIT 20 ;第二條語句:查詢符合條件的詳細數據,將第一條sql的結果使用in操作拼接到第二條的sqlSELECT DISTINCT g.*, cp.name AS cp_name,c.name AS
  • 面試被問:JDBC底層是如何連接資料庫的?|sql|mysql|數據源|java|...
    但是如果你在初級或者中級的階段,就知道了答案,豈不是爽歪歪麼?  估計大部分人都不知道這個問題該怎麼回答,稍微發散一下思維,倒是可以猜測一下,今天我們就來搞清楚JDBC底層到底是如何連接資料庫的。往後別再猜了。  反過來,如果面試官問你JDBC的時候,你能知道底層是怎麼連接資料庫的,估計,很多相對較水的面試官也會一臉懵逼。
  • MySQL資料庫測試題
    >資料庫中,以下哪條語句是取第2頁中的數據?的文件,以下哪些語句可以利用db.sql恢復資料庫test(資料庫名已經存在)中的表結構和數據?C、在Mysql提示符下輸入以下命令mysqldump -uroot -p1234 test>d:/db.sql4、下列SQL語句中,創建關係表的是?
  • mysql條件查詢,最簡單的一種,你知道嗎?
    在上一篇文章中我們學習了在php中怎樣查詢資料庫中的數據,哪些數據都是直接獲取一個表中的所有數據,全部拿過來,沒有經過過濾,很多數據對於我們來說暫時是用不上的,這就相當於浪費了帶寬,不利於提高數據處理的效率,所以,我們非常有必要在抓取數據的時候進行過濾,今天就介紹mysql的條件查詢,最簡單的一種
  • MySQL如何完成一次查詢?
    MySQL相信大家都不陌生,是一種關係型資料庫,通過sql語言操作數據的增刪改查。那麼從發出一條sql指令到返回結果mysql都做了什麼事情呢?
  • Python 操作MySQL資料庫
    資料庫並創建號表、欄位。create_time =time.strftime('%Y-%m-%d%H:%M:%S',time.localtime(time.time()))def readSQL():    #查詢SQL語句    sql="SELECTid,`apiname`,apiurl from
  • MySQL資料庫的分組操作,語句拼接,列轉行操作
    本文介紹MySQL資料庫的分組操作,語句拼接,列轉行操作。關於group by 的sql_mode關於group by 的sql_modeonly_full_group_by說明:僅是MySQL5.7中存在,5.6和8.0都沒有,查看sql_modeselect @@sql_mode;在帶有group by 子句的select中,select後的條件列(非主鍵列),要麼是group by 後面的列,要麼需要在函數中
  • MySQL的SQL語句 - 資料庫管理語句 - 帳戶管理語句 - GRANT 語句 (3)
    在執行 GRANT 語句之後註冊的動態權限不會追溯到任何帳戶。MySQL 將全局權限存儲在 mysql.user 系統表。資料庫權限應用於給定資料庫中的所有對象。如果沒有默認資料庫,則會發生錯誤。可以在資料庫級別指定 CREATE、DROP、EVENT、GRANT OPTION、LOCK TABLES 和 REFERENCES 權限。表或例程權限也可以在資料庫級別指定,在這種情況下,它們應用於資料庫中的所有表或例程。MySQL 將資料庫權限存儲在 mysql.db 系統表。表權限應用於給定表中的所有列。
  • 一道簡單的sql語句題
    結果才發現,數據分析崗位大多注重的是資料庫的能力,比如sql語句的考察,hive的考察,以及一些運營思維的考察,所以第一次面試就很悲劇啦,不過題目還是很有代表性的。其他的不寫了,這裡只分享一個關於sql的題目。1、問題引出現在有兩個數據表,一個數據表記錄司機的信息,比如司機id,司機姓名,司機註冊時間等等,一個數據表記錄一天的訂單情況,比如訂單ID,訂單司機id,訂單時間。
  • php mysql SQL注入語句構造
    由於PHP和MYSQL本身得原因,PHP+MYSQL的注射要比asp困難,尤其是注射時語句的構造方面更是個難點,本文主要是借對Okphp BBS v1.3一些文件得簡單分析,來談談php+mysql注射語句構造方式,希望本文對你有點幫助。
  • MySQL的SQL語句 - 資料庫管理語句 - 帳戶管理語句 - REVOKE 語句
    只有所有指定用戶和角色都成功時,該語句才會被寫入二進位日誌。要撤銷所有權限,請使用第二種語法,它刪除指定用戶或角色的所有全局、資料庫、表、列和例程權限:REVOKE ALL PRIVILEGES, GRANT OPTION FROM user_or_role [, user_or_role] ...REVOKE ALL PRIVILEGES,GRANT OPTION 不撤銷任何角色。
  • MySQL資料庫「十宗罪」(十大經典錯誤案例)
    結果發現,我們在從庫中進行了一條針對有主鍵表的 sql 語句的插入,導致主庫再插入相同 sql 的時候,主從狀態出現異常。發生主鍵衝突的報錯。解決方法:在確保主從數據一致性的前提下,可以在從庫進行錯誤跳過。一般使用 percona-toolkit 中的 pt-slave-restart 進行。
  • 【資料庫】MySQL進階六、模糊查詢用法
    【資料庫】MySQL進階六、模糊查詢用法javahelpmysql中模糊查詢的四種用法介紹這篇文章主要介紹了
  • 【用binlog日誌】恢復 MySQL 資料庫刪除數據
    1)二進位日誌索引文件(文件名後綴為.index):用於記錄所有的二進位文件;2)二進位日誌文件(文件名後綴為.00000*):記錄資料庫所有的DDL和DML(除了數據查詢語句select)語句事件。binlog日誌對於mysql資料庫來說是十分重要的。