搜尋
首頁資料庫mysql教程mysql hint是什麼
mysql hint是什麼Jun 27, 2022 pm 02:12 PM
mysql

在mysql中,hint指的是“查詢優化提示”,會提示優化器按照一定的方式來產生執行計劃進行優化,讓用戶的sql語句更具靈活性;Hint可基於表的連接順序、方法、存取路徑、平行度等規則對DML(資料操縱語言,Data Manipulation Language)語句產生作用。

mysql hint是什麼

本教學操作環境:windows7系統、mysql8版本、Dell G3電腦。

我們可以在操作表、欄位或索引時加入 comment 來增強程式碼可讀性,以便他人快速讀取程式碼,這是對使用資料庫的人的一種提示;同樣的,還有一種提示,叫做hint,是給資料庫的提示。

何謂hint

hint指的是“查詢最佳化提示”,它會提示優化器按照一定的方式去優化,讓你的sql語句更有彈性,這會讓你的查詢更快,當然也可能更慢,這完全取決於你對優化器的理解和場景的了解。

我們知道執行一條SQL語句時,MySQL會產生一個執行計劃,而hint就是告訴查詢最佳化器需要按照我們告訴它的方式來產生執行計劃。

Hint可基於表格的連接順序、方法、存取路徑、平行度等規則對DML(資料操縱語言,Data Manipulation Language)語句產生作用,範圍如下:

使用的优化器类型;
基于代价的优化器的优化目标,是all_rows还是first_rows;
表的访问路径,是全表扫描,还是索引扫描,还是直接用rowid;
表之间的连接类型;
表之间的连接顺序;
语句的并行程度;

常用hint

  • 強制索引FORCE INDEX
    SELECT * FROM tbl FORCE INDEX (FIELD1) …

  • 忽略索引IGNORE INDEX
    SELECT * FROM tbl IGNORE INDEX (FIELD1, FIELD2) …

  • #關閉查詢緩衝SQL_NO_CACHE
    SELECT SQL_NO_CACHE field1, field2 FROM tbl;
    需要查詢即時資料且頻率不高時,可以考慮把緩衝關閉,即無論此是否已執行,MySQL都不會在緩衝區中查找。

  • 強制查詢緩衝SQL_CACHE
    SELECT SQL_CACHE * FROM tbl;
    功能同上一條相反,但僅在my.ini中的query_cache_type設為2時起作用。

  • 優先操作 HIGH_PRIORITY
    HIGH_PRIORITY可以使用在select和insert操作中,讓MYSQL知道,這個操作優先進行。
    SELECT HIGH_PRIORITY * FROM tbl;

  • 滯後操作LOW_PRIORITY
    LOW_PRIORITY可以使用在insert和update操作中,讓mysql知道,這個操作滯後。
    update LOW_PRIORITY tbl set field1= where field1= …

  • ##延遲插入INSERT DELAYED


    INSERT DELAYED INTO tbl set field1= … 指客戶端提交插入資料申請,MySQL返回OK狀態卻並未實際執行,而是儲存在記憶體中排隊,當mysql有剩餘時再插入。
    一個重要的好處是,來自多個客戶端的插入請求被集中在一起,編寫入一個區塊,比獨立執行許多插入要快很多。
    壞處是,不能回傳自增ID,以及系統崩潰時,MySQL也未來得及被插入的資料將會遺失。

  • 強制連接順序STRAIGHT_JOIN


    SELECT tbl.FIELD1, tbl2.FIELD2 FROM tbl STRAIGHT_JOIN tbl2 WHERE …由上面的SQL語句可知,透過STRAIGHT_JOIN強迫MySQL依照tbl、tbl2的順序連接表。如果你認為以自己的順序比MySQL推薦的順序進行連接的效率高的話,就可以透過STRAIGHT_JOIN來決定連接順序。

不常用

  • 強制使用臨時表SQL_BUFFER_RESULT


    SELECT SQL_BUFFER_RESULT * FROM tbl WHERE …當我們查詢的結果集中的資料比較多時,可以透過SQL_BUFFER_RESULT.選項強制將結果集放到臨時表中,這樣就可以很快地釋放MySQL的表鎖(這樣其它的SQL語句就可以對這些記錄進行查詢了),並且可以長時間地為客戶端提供大記錄集。

  • 分組使用臨時表SQL_BIG_RESULT和SQL_SMALL_RESULT


    SELECT SQL_BUFFER_RESULT FIELD1, COUNT(*) FROM tbl GROUP BY FIELD1;對SELECT語句告訴MySQL優化去對GROUP BY和DISTINCT查詢如何使用臨時表排序,SQL_SMALL_RESULT表示結果集很小,可以直接在記憶體的臨時表排序;反之則很大,需要使用磁碟臨時表排序。

  • SQL_CALC_FOUND_ROWS
    它其實不是優化器提示,也不影響優化器的執行計劃,但會讓mysql傳回的結果集中包含本次操作影響的總行數,需與FOUND_ROWS() 聯用。
    SQL_CALC_FOUND_ROWS 通知MySQL將本處理的行數記錄下來; FOUND_ROWS() 用於取出被記錄的行數,可以套用到分頁場景。
    一般的分頁寫法為:先查總數,計算頁數,再查詢某一頁的詳情。
    SELECT COUNT(*) 從 tbl WHERE …
    SELECT * FROM tbl WHERE …limit m,n
    但使用SQL_CALC_FOUND_ROWS#可以簡化成如下寫法:
    SELECT SQL_CALC_FOUND_ROWS * FROM tbl WHERE … limit m,n;
    SELECT FOUND_ROWS();
    第二條# SELECT將傳回第一條SELECT不帶limit時的總行數,如此只需執行一次較耗時的複雜查詢就可同時得到總行數。

  • LOCK IN SHARE MODE、 FOR UPDATE
    同樣的,這兩個也不是最佳化提示,是控制SELECT語句的鎖定機制,只對行級鎖定有效,即InnoDB支持。

擴充知識:

#概念與差異

SELECT ... LOCK IN SHARE MODE新增的是IS鎖(意向共享鎖),即在符合條件的rows上都加了共享鎖,其他session可讀取記錄,亦可繼續添加IS鎖,但無法修改,直到這個加鎖的session done(否則直接鎖定等待逾時)。

SELECT ... FOR UPDATE 新增的是IX鎖(意向排它鎖),即符合條件的rows上都加了排它,其他session無法為這些記錄添加任何S鎖或X鎖。如果不存在一致性非鎖定讀的話,則其他session是無法讀取和修改這些記錄的,但innodb有非鎖定讀(快照讀不需要加鎖)。
因此,for update的加鎖方式只是比lock in share mode的方式多阻塞了select...lock in share mode的查詢方式,並不會阻塞快照讀取。

應用場景

LOCK IN SHARE MODE的適用於兩張存在關係的表的寫場景,以mysql官方例子來說,一個表是child表,一個是parent表,假設child表的某一列child_id映射到parent表的c_child_id列,從業務角度講,此時直接insert一條child_id=100記錄到child表是存在風險的,因為insert的同時可能存在parent表執行了刪除c_child_id=100的記錄,業務資料有不一致的風險。正確方法是先執行select * from parent where c_child_id=100 lock in share mode,鎖定parent表的這條記錄,然後執行insert into child(child_id) values (100)

【相關推薦:mysql影片教學

#

以上是mysql hint是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
图文详解mysql架构原理图文详解mysql架构原理May 17, 2022 pm 05:54 PM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于架构原理的相关内容,MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层,下面一起来看一下,希望对大家有帮助。

mysql的msi与zip版本有什么区别mysql的msi与zip版本有什么区别May 16, 2022 pm 04:33 PM

mysql的msi与zip版本的区别:1、zip包含的安装程序是一种主动安装,而msi包含的是被installer所用的安装文件以提交请求的方式安装;2、zip是一种数据压缩和文档存储的文件格式,msi是微软格式的安装包。

mysql怎么去掉第一个字符mysql怎么去掉第一个字符May 19, 2022 am 10:21 AM

方法:1、利用right函数,语法为“update 表名 set 指定字段 = right(指定字段, length(指定字段)-1)...”;2、利用substring函数,语法为“select substring(指定字段,2)..”。

mysql怎么替换换行符mysql怎么替换换行符Apr 18, 2022 pm 03:14 PM

在mysql中,可以利用char()和REPLACE()函数来替换换行符;REPLACE()函数可以用新字符串替换列中的换行符,而换行符可使用“char(13)”来表示,语法为“replace(字段名,char(13),'新字符串') ”。

mysql怎么将varchar转换为int类型mysql怎么将varchar转换为int类型May 12, 2022 pm 04:51 PM

转换方法:1、利用cast函数,语法“select * from 表名 order by cast(字段名 as SIGNED)”;2、利用“select * from 表名 order by CONVERT(字段名,SIGNED)”语句。

MySQL复制技术之异步复制和半同步复制MySQL复制技术之异步复制和半同步复制Apr 25, 2022 pm 07:21 PM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于MySQL复制技术的相关问题,包括了异步复制、半同步复制等等内容,下面一起来看一下,希望对大家有帮助。

mysql怎么判断是否是数字类型mysql怎么判断是否是数字类型May 16, 2022 am 10:09 AM

在mysql中,可以利用REGEXP运算符判断数据是否是数字类型,语法为“String REGEXP '[^0-9.]'”;该运算符是正则表达式的缩写,若数据字符中含有数字时,返回的结果是true,反之返回的结果是false。

带你把MySQL索引吃透了带你把MySQL索引吃透了Apr 22, 2022 am 11:48 AM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了mysql高级篇的一些问题,包括了索引是什么、索引底层实现等等问题,下面一起来看一下,希望对大家有帮助。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版