1. 程式人生 > >2017-12-05 DBA日記,mysql的datetime欄位索引不能識別sysdate

2017-12-05 DBA日記,mysql的datetime欄位索引不能識別sysdate

一、案例描述

今日在進行MYSQL日常檢查時,發現有一條SQL語句,在欄位型別為datetime並建立索引的情況下,進行between (sysdate()+interval(-1) hour) and sysdate()時並不會使用索引,但是用now()代替sysdate就可以使用索引,這是為什麼呢?

二、問題

為什麼datetime欄位(已有且只有一個關鍵字的索引)與sysdate()進行比較運算時不使用索引,而用now()則會?

三、思路

不使用索引的情況一般是型別不對,那麼sysdate()返回的型別不是datetime? 判斷sysdate()返回的型別

四、收集資料與分析

  1. 確認sysdate(),now()的返回型別
create table qqt.t1 as select now();
create table qqt.t2 as select sysdate();
desc qqt.t1;
desc qqt.t2;

發現now()和sysdate()返回的都是datetime型別

  1. sysdate()和now()有什麼區別呢?
SYSDATE()

Returns the current date and time as a value in 'YYYY-MM-DD HH:MM:SS' or YYYYMMDDHHMMSS.uuuuuu format, depending on
whether the function is used in a string or numeric context. SYSDATE() returns the time at which it executes. This differs from the behavior for NOW(), which returns a constant time that indicates the time at which the statement began to execute. (Within a stored function or trigger, NOW() returns the
time at which the function or triggering statement began to execute.) mysql> SELECT NOW(), SLEEP(2), NOW(); +---------------------+----------+---------------------+ | NOW() | SLEEP(2) | NOW() | +---------------------+----------+---------------------+ | 2006-04-12 13:47:36 | 0 | 2006-04-12 13:47:36 | +---------------------+----------+---------------------+ mysql> SELECT SYSDATE(), SLEEP(2), SYSDATE(); +---------------------+----------+---------------------+ | SYSDATE() | SLEEP(2) | SYSDATE() | +---------------------+----------+---------------------+ | 2006-04-12 13:47:44 | 0 | 2006-04-12 13:47:46 | +---------------------+----------+---------------------+ In addition, the SET TIMESTAMP statement affects the value returned by NOW() but not by SYSDATE(). This means that timestamp settings in the binary log have no effect on invocations of SYSDATE(). Because SYSDATE() can return different values even within the same statement, and is not affected by SET TIMESTAMP, it is nondeterministic and therefore unsafe for replication if statement-based binary logging is used. If that is a problem, you can use row-based logging. Alternatively, you can use the --sysdate-is-now option to cause SYSDATE() to be an alias for NOW(). This works if the option is used on both the master and the slave. The nondeterministic nature of SYSDATE() also means that indexes cannot be used for evaluating expressions that refer to it.

根據官方說明已經很好理解了,因為sysdate()是該函式執行時動態獲取時間,NOW()是語句開始時就獲取時間,這時優化器進行SQL解釋時,已經能確認NOW()返回值,但sysdate()不能,所以不能評估成本,於是優化器只能對sysdate()選擇全表掃描,就now()就可以用索引了。

五、結論

  • 對於索引關鍵字是datetime型別的欄位,使用sysdate進行比較運算時,由於優化器進行SQL評估時是無法獲知sysdate()值,而令優化器無法評估成本,所以只能全表掃描。
  • 對於now()函式,由於優化器進行SQL執行計劃評估時就已經能確定返回的值,所以可以評估出索引還是全表掃描更合適。

相關推薦

2017-12-05 DBA日記mysql的datetime索引不能識別sysdate

一、案例描述 今日在進行MYSQL日常檢查時,發現有一條SQL語句,在欄位型別為datetime並建立索引的情況下,進行between (sysdate()+interval(-1) hour) and sysdate()時並不會使用索引,但是用now()代替sysda

2017-04-28 DBA日記各作業系統OS系統日誌檢視方法

背景: 如之前章節所介紹的,資料庫問題分析的一個重要步驟就是收集資料,其中作業系統日誌的收集便是其中一部份,所以為了能夠快速準確收集到該部份的日誌,我們必須瞭解各個作業系統日誌的檢視方式。 問題: 如何能快速有效檢視作業系統的日誌? 解答: 1. LINUX的日誌檢視

2017-04-12 DBA日記頻繁commit導致的log file sync的診斷

背景: 2017-04-11 19:20收到開發員反饋,在某庫db1上執行update語句很快,但commit很慢,至少執行了5分鐘commit都沒有返回。 問題: 是什麼原因導致commit被

mysql資料庫的簡單增刪改查合併拼接字元操作用java完成將一張表中的查詢結果合併存入另一張表的指定

首先問題描述:我現在有兩個表,一個表是關鍵詞,一個表是含有關鍵詞的標籤,需要做的就是在關鍵詞表中新建一個標籤欄位,把包含該關鍵詞的全部標籤存入其中。比如關鍵詞是Java,標籤可能有Java開發,Java後臺等。我這裡關鍵詞有4000個,標籤有40000個,我用了小段java程式碼+sql的函式就完成

將json串轉換為物件時候出現和屬性不匹配問題

報錯資訊如下: org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "HPYS" (Class com.traffic.entity.BusBaseInfo), not marked

SQL server 2008 新增刪除

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

for xml path 與 group_concat 與 WM_CONCAT合併成一行資料

  -- sql server,自定義用逗號分割 SELECT     id,     psn = (stuff (( SELECT ',' + realname FROM staff_tbl WHERE psn = 'c0c

資料庫工作筆記010---Mysql中用SQL增加、刪除修改名、型別、註釋調整順序總結

  JAVA技術交流QQ群:170933152   Mysql中用SQL增加、刪除欄位,修改欄位名、欄位型別、註釋,調整欄位順序總結   在網站重構中,通常會進行資料結構的修改,所以新增,刪除,增加mysql表的欄位是難免的,有時為了方便,還會增加

主表和附表的關聯關係普通就可以實現為什麼還要有主鍵外來鍵?之間有什麼關係

主鍵和外來鍵是把多個表組織為一個有效的關係資料庫的粘合劑。主鍵和外來鍵的設計對物理資料庫的效能和可用性都有著決定性的影響。必須將資料庫模式從理論上的邏輯設計轉換為實際的物理設計。而主鍵和外來鍵的結構是這個設計過程的癥結所在。一旦將所設計的資料庫用於了生產環境,就很難對這些鍵進行修改,所以在開發階段就

Json過濾器(基於spring自定義註解的方式進行過濾)

在實際的開發過程中,會經常遇到如下情景: 後臺需要給前端返回JSON資料,但是查詢出來返回的資料裡面有很多屬性是不需要的 本文通過自定義註解的方式進行實現,對response進行攔截,通過註解引數,設定欄位資訊(即,過濾哪些欄位,保留哪些欄位),並將bean自動封裝

如何修改帶索引的長度檢視、刪除索引修改屬性、建立索引

需要重新建立索引,因為長度不同會認為是兩個不同的所索引。 建立和刪除索引 索引的建立可以在CREATE TABLE語句中進行,也可以單獨用CREATE INDEX或ALTER TABLE來給表增加索引。刪除索引可以利用ALTER TABLE或DROP INDEX語句來實現。 (1)使用ALTER T

知識點:mysql查詢資料時做加、減、乘、除null的四則運算為null

該處不羅列出每種情況,以減法、加法、乘法為例,說明該情況: 展示emp表: 1、減法: select empno,ename,sal-200 from emp; 2、乘法: select empno,ename,sal*12 from emp;    

mysql列轉行合併

資料表:  列轉行:利用max(case when then) max---聚合函式 取最大值 (case course when '語文' then score else 0 en

Java JDBC中MySQL型別到JAVA型別的轉換

1. 概述   在使用Java JDBC時,你是否有過這樣的疑問:MySQL裡的資料型別到底該選擇哪種Java型別與之對應?本篇將為你揭開這個答案。 2. 型別對映    java.sql.Types定義了常用資料庫(MySQL、Oracle、DB2等)所用到的資料型別

sql自動獲取有格式的編碼新增值

1、根據時間和特殊的字元加自增數獲取值,每天自動更新 SELECT CONCAT('${applyType}',DATE_FORMAT(NOW(),'%Y%m%d'), LPAD(RIGHT((CASE WHEN MAX(a.apply_no) IS NULL THEN '0

Oracle 根據值查詢其所在的表、(只有值資訊型別都不知道)

今天一哥們求助,oracle的我只知道ziduan欄位的值,連型別,大小設定全都不知道,如何查詢到該欄位所在的表,以及該欄位名。以下是我編寫的實際指令碼: 1.假設該欄位是varchar2或者char型別 DECLARE CURSOR cur_hh IS SELECT tabl

帝國CMS使用sql語句查詢時有些不顯示

使用sql查詢資料時,有些欄位不顯示,比如<?=$bqsr[classname]?>顯示為空,或者其他的。 [e:loop={'select classid,classpath,classname from [!db.pre!]enewsclass where

DevExpress中繫結資訊列表時如何再繫結方法

  GridView.CustomDrawCell事件可以對GridView展示的列進行處理. gridView1.CustomDrawCell += gridView1_CustomDrawCell; void gridView1_CustomDrawCell(object

檢視並修改Oracle使用者的密碼【oracle不能檢視dba users裡password(儲存密碼的加密過的字串

本文是資料庫版本:9.2.0.5有時候我們可能不知道一個使用者的密碼,但是又需要以這個使用者做一些操作,又不能去修改掉這個使用者的密碼,或者自己乾脆忘記密碼了,想修改自己的密碼,這個時候,就可以利用一些小竅門,來完成操作。具體操作過程如下:SQL*Plus: Release 9.2.0.5.0 - Produ

Java記憶體模型FAQ(九)在新的Java記憶體模型中final是如何工作的

原文:http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html 第九章 譯者:Alex 一個物件的final欄位值是在它的構造方法裡面設定的。假設物件被正確的構造了,一旦物件被構造,在構造方法裡面設定給final欄位的的值在沒有