成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL數據類型隱式轉換規則

數據庫 MySQL
今天遇到一個慢查詢,乍一看,明明創建了一個唯一索引,正常來說,上面的查詢語句應該正好命中idx_areacode_period這個索引的,不應該是慢查詢的。MySQ在查詢的時候,會將areacode轉換成浮點型進行比較。

 

[[213994]]

現象

今天遇到一個慢查詢,查詢日志找到慢查詢語句是這樣的:

  1. select * from convert_test where areacode=0001 and period>='20170511' and period<='20170511'

convert_test表結構如下:

  1. CREATE TABLE `convert_test` ( 
  2.     `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
  3.     `areacode` char(12) NOT NULL DEFAULT ''
  4.     `period` int(6) unsigned NOT NULL DEFAULT 0, 
  5.     `mid_price` int(10) unsigned NOT NULL DEFAULT 0, 
  6.     `mid_change` float NOT NULL DEFAULT 0, 
  7.     `updated_datetime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
  8.     PRIMARY KEY (`id`), 
  9.     UNIQUE KEY `idx_areacode_period` (`areacode`,`period`) 
  10. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='隱式轉換測試表'

表中數據42W以上。

乍一看,明明創建了一個唯一索引,正常來說,上面的查詢語句應該正好***idx_areacode_period這個索引的,不應該是慢查詢的。

為了查看這個語句是怎么查詢的,我們在測試庫中explain一下:

  1. mysql> explain select * from convert_test where areacode=0001 and period>='20170511' and period<='20170511'

結果如下:

可以看到,這里是沒有用到索引的。

原因

定義表的時候,areacode字段是字符串類型的,查詢的時候傳入的是0001,這里0001被Mysql當做了整數處理為1,Mysql檢測到areacode這個字段的查詢類型是整型,就會全表掃描,將所有行的areacode轉換成整型,然后在做查詢處理。

找原因了,就很好解決了,上面的sql語句修改如下:

  1. mysql> explain select * from convert_test where areacode='0001' and period>='20170511' and period<='20170511'

結果如下: 

可以看到完全***了idx_areacode_period 這個索引。

擴展

上面的period定義的時候是整型,但是查詢傳入的是字符串類型,那為什么會***索引的呢?

看一下官方的隱試轉換說明:

  1. 兩個參數至少有一個是 NULL 時,比較的結果也是 NULL,例外是使用 <=> 對兩個 NULL 做比較時會返回 1,這兩種情況都不需要做類型轉換

  2. 兩個參數都是字符串,會按照字符串來比較,不做類型轉換

  3. 兩個參數都是整數,按照整數來比較,不做類型轉換

  4. 十六進制的值和非數字做比較時,會被當做二進制串

  5. 有一個參數是 TIMESTAMP 或 DATETIME,并且另外一個參數是常量,常量會被轉換為 timestamp

  6. 有一個參數是 decimal 類型,如果另外一個參數是 decimal 或者整數,會將整數轉換為 decimal 后進行比較,如果另外一個參數是浮點數,則會把 decimal 轉換為浮點數進行比較

  7. 所有其他情況下,兩個參數都會被轉換為浮點數再進行比較

所以,下面的幾個sql語句有相同的效果:

  1. select * from convert_test where areacode=0001 and period>='20170511' and period<='20170511'
  2. select * from convert_test where areacode=1 and period>='20170511' and period<='20170511'
  3. select * from convert_test where areacode=0001.0 and period>='20170511' and period<='20170511'
  4. select * from convert_test where areacode=1.0 and period>='20170511' and period<='20170511'

mysql 在查詢的時候,會將areacode轉換成浮點型進行比較 

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2009-07-02 15:59:55

JSP數據類型

2019-09-28 22:41:18

OracleMySQL隱式數據

2017-09-13 10:58:51

JavaScript轉換規則

2017-09-05 16:17:35

JavaScript運算轉換

2023-08-14 08:35:36

2010-09-06 16:25:46

SQL函數

2022-10-27 20:42:04

JavaScripJava編程語言

2023-12-12 08:50:22

MySQL隱式轉換varchar

2017-07-10 13:38:07

MySQL數據類型整數類型

2022-02-23 21:24:21

索引SQL字符

2010-09-17 14:57:34

JAVA數據類型

2011-07-01 15:32:58

Qt 數據類型

2009-08-04 14:56:34

ASP.NET數據類型

2010-10-15 13:28:34

MySql數據類型

2024-12-09 12:00:00

Python編程數據類型轉換

2009-09-01 16:35:55

C#操作String數

2010-09-06 17:35:43

SQL函數

2009-09-04 10:49:19

C#隱式轉換

2010-03-30 16:33:55

Oracle數據類型

2009-08-12 16:26:27

C#數據類型轉換
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 性欧美精品一区二区三区在线播放 | 精品中文视频 | 国产精品美女久久久久aⅴ国产馆 | 国产成人一区二区三区 | 妞干网福利视频 | 高清一区二区三区 | 国产精品美女久久久久aⅴ国产馆 | 91最新在线视频 | 亚洲精品久久久久久久久久久 | 365夜爽爽欧美性午夜免费视频 | 伊人免费网 | 9久久| 国产一区二区三区免费观看视频 | 啪一啪在线视频 | 亚洲精品久久久一区二区三区 | 夜夜骚 | 久久成人精品视频 | 亚洲成人av | 在线免费看黄 | 亚洲成人精品在线观看 | 国产一级视频 | 亚洲午夜av久久乱码 | 福利电影在线 | 日本一道本视频 | 久久九九99 | 玖玖综合在线 | 日日夜夜天天久久 | 欧美电影大全 | 人人爱干 | 91精品国产91久久久久久三级 | 国产午夜亚洲精品不卡 | 国产精品成人一区二区三区 | 婷婷久久综合 | 欧美一区二区在线观看 | 免费一区二区三区在线视频 | 99久久婷婷国产亚洲终合精品 | 色婷婷亚洲一区二区三区 | 亚洲国产精品视频一区 | 成人精品免费 | 国产偷录视频叫床高潮对白 | 国产精品久久久久久久久久软件 |