日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于cast类型转换后无法使用索引的优化

發布時間:2024/4/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于cast类型转换后无法使用索引的优化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
關于cast類型轉換后無法使用索引的優化

因為表設計時是各開發人員建立的表,同是建立日期字段add_time,有int,還有varchar(50)幾種數據類型,如下:
(字段有刪減)

mys

ql> show create table credit_tender; +--------------------------+------------------------ | Table | Create Table | +--------------------------+------------------------ | credit_tender | CREATE TABLE `credit_tender` (`assign_id` int(11) unsigned NOT NULL AUTO_INCREMENT,`user_id` int(11) NOT NULL DEFAULT '0' COMMENT '用戶名稱',`credit_user_id` int(11) DEFAULT NULL COMMENT '出讓人id',`status` int(2) DEFAULT '0' COMMENT '狀態',`add_time` varchar(50) DEFAULT NULL COMMENT '添加時間',`addip` varchar(50) DEFAULT NULL COMMENT 'ip',`client` int(11) DEFAULT NULL COMMENT '客戶端',PRIMARY KEY (`assign_id`),KEY `user_id` (`user_id`),KEY `idx_add_time` (`add_time`) ) ENGINE=InnoDB AUTO_INCREMENT=20152 DEFAULT CHARSET=utf8 COMMENT='債權投資表' |

可以看到字段
add_time varchar(50) DEFAULT NULL COMMENT ‘添加時間’,
有索引:
KEY idx_add_time (add_time)

但現在的查詢,所有都是使用了以下查詢

SELECT * FROM borrow_tender t WHERE FROM_UNIXTIME(t.addtime,'%Y-%m-%d %H:%i:%s') >= '2018-03-19 00:00:00' AND FROM_UNIXTIME(t.addtime,'%Y-%m-%d %H:%i:%s') <= '2018-03-19 23:59:59'

查看執行計劃如下:
可以看到,有索引,但并沒有走索引,還是全表搜索(type:ALL),

mysql> explain SELECT * FROM borrow_tender tWHERE FROM_UNIXTIME(t.addtime,'%Y-%m-%d %H:%i:%s') >= '2018-03-19 00:00:00' AND FROM_UNIXTIME(t.addtime,'%Y-%m-%d %H:%i:%s') <= '2018-03-19 23:59:59'; +----+-------------+--------+------+---------------+------+---------+------+--------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+--------+------+---------------+------+---------+------+--------+-------------+ | 1 | SIMPLE | tender | ALL | NULL | NULL | NULL | NULL | 664731 | Using where | +----+-------------+--------+------+---------------+------+---------+------+--------+-------------+ 1 row in setmysql>

還看到這個表有以下查詢條件的,相對于上面的查詢,稍有思考,知道轉換成相同數據類型進行對比查詢:

mysql> explain SELECT user_id,status,add_time from credit_tender t WHERE t.add_time >= cast(unix_timestamp('2018-03-19 00:00:00') as CHAR) AND t.add_time <= cast(unix_timestamp('2018-03-19 23:59:59') as CHAR); +----+-------------+-------+------+---------------+------+---------+------+-------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+------+-------+-------------+ | 1 | SIMPLE | hct | ALL | NULL | NULL | NULL | NULL | 14287 | Using where | +----+-------------+-------+------+---------------+------+---------+------+-------+-------------+ 1 row in set

但我們看到,還是沒走索引,為什么?
cast(unix_timestamp(‘2018-03-19 00:00:00’) as CHAR) 已轉換成字串了呀,為什么。
這里是因為char 是定長,而我們的字段類型為 varchar()
所以,這里只要使用以下函數即可
cast(unix_timestamp(‘2018-03-19 00:00:00’) as NCHAR)

mysql> explain SELECT user_id,status,add_time from credit_tender hct WHERE hct.add_time >= cast(unix_timestamp('2018-03-19 00:00:00') as NCHAR) AND hct.add_time <= cast(unix_timestamp('2018-03-19 23:59:59') as NCHAR); +----+-------------+-------+-------+---------------+--------------+---------+------+------+-----------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+--------------+---------+------+------+-----------------------+ | 1 | SIMPLE | hct | range | idx_add_time | idx_add_time | 153 | NULL | 45 | Using index condition | +----+-------------+-------+-------+---------------+--------------+---------+------+------+-----------------------+ 1 row in set

或者使用 CONCAT 函數,隱性轉換成字串的方法

mysql> explain SELECT user_id,status,add_time from credit_tender hct WHERE hct.add_time >= CONCAT(unix_timestamp('2018-03-19 00:00:00'),'') AND hct.add_time <= CONCAT(unix_timestamp('2018-03-19 23:59:59') ,'') ; +----+-------------+-------+-------+---------------+--------------+---------+------+------+-----------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+--------------+---------+------+------+-----------------------+ | 1 | SIMPLE | hct | range | idx_add_time | idx_add_time | 153 | NULL | 45 | Using index condition | +----+-------------+-------+-------+---------------+--------------+---------+------+------+-----------------------+ 1 row in setmysql>

總結

以上是生活随笔為你收集整理的关于cast类型转换后无法使用索引的优化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。