程序員的mysql面試金典(mysql面試寶典)

本文目錄一覽:

為什麼MySQL字符串不加引號索引會失效?這個答案是我見過最靠譜

作為一名程序員,在求職面試時,不知你有沒有遇到類似這樣的問題。

張工是一名java程序員,最近到一家軟件公司應聘軟件開發崗位,面試官問了他關於MySql索引這樣的一個問題。

對於這個問題張工之前在做項目時也曾遇到,那時候字段明明是加了索引,可不明白為什麼還是很慢。後加上引號就正常了,為了趕項目進度,張工也沒有再去留意。

現在面試官突然這麼一問,張工也說不出個所以然來。

面試官讓他回去等通知。

我們知道MySql索引可以加快數據檢索速度,這也是使用的索引的最主要原因。但有時候使用不當就會遇到索引失效問題,譬如在MySQL字符串類型查詢時不加引號索引會失效,是因為MySQL內部進行了隱式轉換。

那為什麼會發生隱式轉換?又是怎麼轉換的呢?

今天我們來聊聊關於MySql索引失效的話題。

先來看看一般導致索引失效的有哪些?

如果一張表的索引有多個,要遵守最佳左前綴法則,即查詢從索引的最左前列開始並且不跳過索引中的列。

用戶表tb_user字段 id,name,age,sex

創建索引為idx_user_name

執行語句:

這時候就會導致索引失效

在索引列上做加工操作,查詢時會導致索引失效,從而導致全表掃描。所以,建議不要在索引列上做任何操作。

舉個例子,例如訂單表tb_order有個索引是dt(日期), 字段數據存放的格式是這樣的2021-12-10 這樣的,如果有個需求需要根據dt,格式是20220207這樣的來查詢,這時候就不要對dt進行格式轉換了,

這樣索引就失效了。

而是應該對 20220207做格式處理

這樣dt索引才不會失效。

例如我們在訂單表tb_order建立了索引idx_order_id,order_id字段類型為varchar

在查詢時如果使用where order_id= 20220207123654100,這樣的查詢方式會直接造成索引失效。

要讓索引生效,正確的用法為

假如有張用戶表tb_user,創建的索引為idx_user_name_age_sex_phone 其中name、age、sex都加了索引。

執行語句

上面這條sql語句只會命中name和age索引,sex索引會失效,複合索引失效需要查看key_len的長度。

再來看一個例子:

從這兩條SQL執行的結果我們可以看出,執行第一條SQL沒有使用到索引,而執行第二條SQL時使用到了索引。這是為什麼呢?

我們需要先了解下mysql索引優化器工作的原理。選擇索引是優化器工作,優化器工作有自己的一套規則,如果等號兩邊的數據類型不一致,則會發生隱式轉換。

基於這條規則,我們回過頭看看

這條SQL語句執行時就會變為

由於對索引列進行了函數操作,所以才導致索引失效,從而全表掃描了。

那麼問題來了,細心的你不知有沒有留意到為什麼是把左側的列轉為int類型,而不是把右側的值轉成字符串類型呢?

什麼情況下把數字轉為字符串,什麼情況下把字符串轉為數字,優化器它是根據什麼規則來進行判斷的?其實規則也並不複雜。

根據這個規則,我們再回過頭看看之前的查詢語句

select ‘12345678936’ = 12345678936

返回1 所以這時候就把左側的列值12345678936轉成數字。

關於MySql索引失效的問題先簡單寫到這,建議平時在做項目時還是要多了解下原理,如果你了解其背後的原理,求職面試時和面試官交流起來就會很舒服了,相信能為這次面試加分,提高被錄用的概率。

為什麼MySQL字符串類型查詢時不加引號索引會失效?這是因為要查詢的字符串字段沒有加引號時,MySQL內部進行了隱式轉換,此次查詢會導致全表掃描,所以慢了。

總結:

在索引列上進行了函數操作,MySQL內部會進行了隱式轉換,導致索引失效,從而產生全表掃描。

由於筆者知識及水平有限,文中錯漏之處在所難免,如有不足之處,歡迎交流。

拓展

索引創建

1、主鍵索引:

2、唯一索引:

3、普通索引:

4、全文索引:

alter table table_name add fulltext (column)

5、聯合索引:

索引刪除

php程序員面試題,mysql怎麼防止注入

php程序員面試題,mysql怎麼防止注入

引發

SQL

注入攻擊的主要原因,是因為以下兩點原因:

1. php 配置文件 php.ini 中的 magic_quotes_gpc選項沒有打開,被置為 off

2. 開發者沒有對數據類型進行檢查和轉義

求《程序員面試金典中文第6版》全文免費下載百度網盤資源,謝謝~

《程序員面試金典中文第6版》百度網盤pdf最新全集下載:

鏈接:

?pwd=wwvc 提取碼: wwvc

簡介:本書是原谷歌面試官的經驗之作,層層緊扣程序員面試的每一個環節,全面而詳盡地介紹了程序員應當如何應對面試,才能在面試中脫穎而出。內容主要涉及面試流程解析,面試官的幕後決策及可能提出的問題,面試前的準備工作,對面試結果的處理,以及出自微軟、蘋果、谷歌等多家知名公司的189道編程面試題及詳細解決方案。第6版修訂了上一版中一些題目的解法,為各章新增了介紹性內容,加入了更多的算法策略,並增添了對所有題目的提示信息。  

程序員面試寶典之Mysql數據庫Innodb引擎的4個隔離級別

題目:請闡述Mysql Innodb引擎的4個隔離級別

難度:三星

面試頻率:五星

這道題真的是一道數據庫的高頻題,數據庫題除了索引的原理之外就是這道題的面試頻率最高。

1.Read uncommitted(讀未提交):,最低的隔離級別,可以一個事務讀到其他事務沒有提交的數據,也稱臟讀,這個隔離級別很少人用

2.Read committed(讀已提交):相比於讀未提交,這個隔離級別只能讀到其他事物已經提交了的數據,這個隔離級別用得比較多。但是不是Mysql默認的隔離級別

3.Repeatable read(可重複讀): 在讀已提交隔離級別中,2次讀取同一個變量如果其他事務修改了它的值,會讀到的不一樣。而在這個隔離級別中,顧名思義,一個事務開始讀了。多次讀到的值可以保證是一樣的

4.Serializable 序列化 在這個隔離級別下,所有的事務都將串行操作,是隔離級別最高的也是效率最低的,很少人用

面試官追問:Innodb引擎默認隔離級別是哪個

答:可重複讀

面試官追問:可重複讀的實現原理

答:使用了MVCC多版本控制(類似樂觀鎖),Innodb引擎會給每一行數據加一個版本號信息,當一個事務修改一個數據時會增加它的版本號+1,當一個事務開始的時候會緩存下此時的版本號,後面讀取的時候只會讀取這個版本號的數據,因此別的事務提交了修改數據的版本號大於它,因此不會被讀到

面試官追問:事務的隔離級別如何設置:

答:在Mysql命令行下調用命令 set global.tx_isolation,但這樣Mysql重啟失效,修改my.cnf來永久設置

面試官追問:可重讀讀有什麼問題

答:會出現幻讀,幻讀是指事務讀取到一個值無法準確繼續後續操作。例如讀取一個值,沒有則插入,但是等插入的時候其他事務已經插入了,這就會導致插入失敗,解決辦法:sql語句顯示加鎖 :select xxxx for update,其他事務修改數據則會阻塞

《程序員面試金典(第5版)》epub下載在線閱讀,求百度網盤雲資源

《程序員面試金典(第5版)》([美] Gayle Laakmann McDowell)電子書網盤下載免費在線閱讀

資源鏈接:

鏈接:

提取碼:79f5  

書名:程序員面試金典(第5版)

作者:[美] Gayle Laakmann McDowell

譯者:李琳驍

豆瓣評分:8.9

出版社:人民郵電出版社

出版年份:2013-11

頁數:372

內容簡介:

本書是原谷歌資深面試官的經驗之作,層層緊扣程序員面試的每一個環節,全面而詳盡地介紹了程序員應當如何應對面試,才能在面試中脫穎而出。第1~7 章主要涉及面試流程解析、面試官的幕後決策及可能提出的問題、面試前的準備工作、對面試結果的處理等內容;第8~9 章從數據結構、概念與算法、知識類問題和附加面試題4 個方面,為讀者呈現了出自微軟、蘋果、谷歌等多家知名公司的150 道編程面試題,並針對每一道面試題目,分別給出了詳細的解決方案。

本書適合程序開發和設計人員閱讀。

作者簡介:

作者簡介:

Gayle Laakmann McDwell

美國求職諮詢網站CareerCup.cm創始人兼CE,是一位著名軟件工程師,曾在微軟、蘋果與谷歌任職。早先,她自己就是一位十分成功的求職者,成功通過了微軟、谷歌、亞馬遜、蘋果、IBM、高盛等多家最著名企業極其嚴苛的面試過程。工作以後,她又成為一位出色的面試官。在谷歌任職期間,她還是該公司資深面試官及招聘委員會成員,期間閱人無數,積累了相當豐富的面試經驗。除此書外,還著有《金領簡歷:敲開蘋果、微軟、谷歌的大門》。

譯者簡介:

李琳驍

從事嵌入式Linux內核/驅動開發,關注IT、開放源碼和安防監控等領域。業餘時以技術翻譯為樂,時而客串編輯,好為愛書挑錯,渴求完美,卻也常因「小」失大,不得讀書要領。翻譯或參與翻譯了《Linux命令詳解手冊》《編程人生》《編程大師訪談錄》等圖書。網絡ID為leal,管理Vim、Andrid等豆瓣小組,個人站點:。

漆犇

畢業於中國地質大學,擁有十餘年軟件開發、測試及流程管理經驗,曾翻譯出版了《Linux/Unix設計思想》《金領簡歷 : 敲開蘋果、微軟、谷歌的大門》等書。目前定居於美國西雅圖,在微軟Windws Phne開發中心從事與WP應用開發者相關的項目管理事務。

《程序員面試金典中文第6版》pdf下載在線閱讀全文,求百度網盤雲資源

《程序員面試金典中文第6版》百度網盤pdf最新全集下載:

鏈接:

?pwd=wwvc 提取碼: wwvc

簡介:本書是原谷歌面試官的經驗之作,層層緊扣程序員面試的每一個環節,全面而詳盡地介紹了程序員應當如何應對面試,才能在面試中脫穎而出。內容主要涉及面試流程解析,面試官的幕後決策及可能提出的問題,面試前的準備工作,對面試結果的處理,以及出自微軟、蘋果、谷歌等多家知名公司的189道編程面試題及詳細解決方案。第6版修訂了上一版中一些題目的解法,為各章新增了介紹性內容,加入了更多的算法策略,並增添了對所有題目的提示信息。  

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/246987.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 13:17
下一篇 2024-12-12 13:18

相關推薦

  • 如何修改mysql的端口號

    本文將介紹如何修改mysql的端口號,方便開發者根據實際需求配置對應端口號。 一、為什麼需要修改mysql端口號 默認情況下,mysql使用的端口號是3306。在某些情況下,我們需…

    編程 2025-04-29
  • 兼職程序員能掙錢嗎?

    可以。不過,兼職程序員賺錢的關鍵就在於如何找到並利用合適的機會。 一、掌握技能 作為程序員,掌握必要的技能是兼職掙錢的前提。除了紮實的編程技能,了解相關工具和平台也非常重要。常見的…

    編程 2025-04-29
  • Python操作MySQL

    本文將從以下幾個方面對Python操作MySQL進行詳細闡述: 一、連接MySQL數據庫 在使用Python操作MySQL之前,我們需要先連接MySQL數據庫。在Python中,我…

    編程 2025-04-29
  • MySQL遞歸函數的用法

    本文將從多個方面對MySQL遞歸函數的用法做詳細的闡述,包括函數的定義、使用方法、示例及注意事項。 一、遞歸函數的定義 遞歸函數是指在函數內部調用自身的函數。MySQL提供了CRE…

    編程 2025-04-29
  • MySQL bigint與long的區別

    本文將從數據類型定義、存儲空間、數據範圍、計算效率、應用場景五個方面詳細闡述MySQL bigint與long的區別。 一、數據類型定義 bigint在MySQL中是一種有符號的整…

    編程 2025-04-28
  • 兼職程序員外包平台的開發與實現

    隨着社會經濟和科技的快速發展,更多人選擇通過互聯網進入編程行業。兼職開發已成為一種新型就業方式,並且這種方式在新冠肺炎疫情襲來、大規模遠程辦公的背景下更為普遍。本文將從多個方面詳細…

    編程 2025-04-28
  • MySQL左連接索引不生效問題解決

    在MySQL數據庫中,經常會使用左連接查詢操作,但是左連接查詢中索引不生效的情況也比較常見。本文將從多個方面探討MySQL左連接索引不生效問題,並給出相應的解決方法。 一、索引的作…

    編程 2025-04-28
  • CentOS 7在線安裝MySQL 8

    在本文中,我們將介紹如何在CentOS 7操作系統中在線安裝MySQL 8。我們會從安裝環境的準備開始,到安裝MySQL 8的過程進行詳細的闡述。 一、環境準備 在進行MySQL …

    編程 2025-04-27
  • 如何使用MySQL字段去重

    本文將從多個方面為您詳細介紹如何使用MySQL字段去重並給出相應的代碼示例。 一、SELECT DISTINCT語句去重 MySQL提供了SELECT DISTINCT語句,通過在…

    編程 2025-04-27
  • MySQL正則表達式替換

    MySQL正則表達式替換是指通過正則表達式對MySQL中的字符串進行替換。在文本處理方面,正則表達式是一種強大的工具,可以方便快捷地進行字符串處理和匹配。在MySQL中,可以使用正…

    編程 2025-04-27

發表回復

登錄後才能評論