`

MySQL int转换成varchar引发的慢查询

 
阅读更多
CREATE TABLE `appstat_day_prototype_201305` (
  `day_key` date NOT NULL DEFAULT '1900-01-01',
  `appkey` varchar(20) NOT NULL DEFAULT '',
  `user_total` bigint(20) NOT NULL DEFAULT '0',
  `user_activity` bigint(20) NOT NULL DEFAULT '0',
  `times_total` bigint(20) NOT NULL DEFAULT '0',
  `times_activity` bigint(20) NOT NULL DEFAULT '0',
  `incr_login_daily` bigint(20) NOT NULL DEFAULT '0',
  `unbind_total` bigint(20) NOT NULL DEFAULT '0',
  `unbind_activitys` bigint(20) NOT NULL DEFAULT '0',
  PRIMARY KEY (`appkey`,`day_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

mysql> explain SELECT * from appstat_day_prototype_201305 where appkey = xxxxx and day_key between '2013-05-23' and '2013-05-30';+----+-------------+------------------------------+------+---------------+------+---------+------+----------+-------------+
| id | select_type | table                        | type | possible_keys | key  | key_len | ref  | rows     | Extra       |
+----+-------------+------------------------------+------+---------------+------+---------+------+----------+-------------+
|  1 | SIMPLE      | appstat_day_prototype_201305 | ALL  | PRIMARY       | NULL | NULL    | NULL | 19285787 | Using where |
+----+-------------+------------------------------+------+---------------+------+---------+------+----------+-------------+
1 row in set (0.00 sec)
 
mysql> explain SELECT * from appstat_day_prototype_201305 where appkey = 'xxxxx' and day_key between '2013-05-23' and '2013-05-30';+----+-------------+------------------------------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table                        | type  | possible_keys | key     | key_len | ref  | rows | Extra       |
+----+-------------+------------------------------+-------+---------------+---------+---------+------+------+-------------+
|  1 | SIMPLE      | appstat_day_prototype_201305 | range | PRIMARY       | PRIMARY | 65      | NULL |    1 | Using where |
+----+-------------+------------------------------+-------+---------------+---------+---------+------+------+-------------+
1 row in set (0.00 sec)

从上面可以很明显的看到由于appkey是varchar,而在where条件中不加'',会引发全表查询,加了就可以用到索引,这扫描的行数可是天差地别,对于服务器的压力和响应时间自然也是天差地别的。

 

虽然poll_id的类型为bigint,但是SQL中添加了'',但是这个语句仍然用到了索引,虽然扫描行数也不少,但是能用到索引就是好SQL。

那么一个小小的''为什么会有这么大的影响呢?根本原因是因为MySQL在对文本类型和数字类型进行比较的时候会进行隐式的类型转换。以下是5.5官方手册的说明……

 

根据以上的说明,当where条件之后的值的类型和表结构不一致的时候,MySQL会做隐式的类型转换,都将其转换为浮点数在比较。

对于第一种情况:

比如where string = 1;

需要将索引中的字符串转换成浮点数,但是由于'1',' 1','1a'都会比转化成1,故MySQL无法使用索引只能进行全表扫描,故造成了慢查询的产生。

分享到:
评论

相关推荐

    MySQL数据库中把int转化varchar引发的慢查询

    综上所述,MySQL中`INT`转`VARCHAR`可能导致的慢查询主要是由于索引失效和隐式类型转换造成的。通过保持数据类型一致性、显式转换、优化查询结构和语句,以及监控性能,可以有效避免这类问题,提升数据库性能。

    Mysql数据库中把varchar类型转化为int类型的方法

    在上篇文章给大家讲了MySQL数据库中把int转化varchar引发的慢查询,本文给大家介绍Mysql数据库中把varchar类型转化为int类型的方法,一起看看吧! mysql为我们提供了两个类型转换函数:CAST和CONVERT,现成的东西...

    mysql语句转postgres的工具

    这涉及到字段类型、约束、索引等的映射,例如,MySQL的`ENUM`类型在PostgreSQL中可能需要转换为`VARCHAR`或`INT`。 2. **触发器创建**:由于PostgreSQL不支持`ON UPDATE`自动更新时间戳,`MysqlToPostgresUtil`会...

    mysql批量修改(字段)列类型

    MySQL存储过程,一键批量修改一个表内的多个列(字段)类型。例如从int转换成varchar

    Mysql varchar大小长度问题介绍

    如果VARCHAR字段的定义长度超过了上述限制,MySQL会将其自动转换为TEXT类型,此时每个字段占用的定义长度不再是根据内容长度变化,而是固定为11字节,但这已经不再是VARCHAR的行为。 在MySQL 4.0及更低版本中,...

    Oracle的表结构转成Mysql的表结构

    ### Oracle的表结构转成MySQL的表结构 #### 功能概述 本文介绍了一种将Oracle数据库中的表结构转换为MySQL数据库表结构的方法。通过编写一个PL/SQL函数`fnc_table_to_mysql`来实现这一目标。该函数可以接受四个参数...

    sqlserver中将varchar类型转换为int型再进行排序的方法

    在SQL Server中,数据类型的转换是一项常见...总的来说,正确地将varchar转换为int进行排序是保证数据正确性和查询效率的关键步骤,而理解并灵活运用各种排序方法和技巧,对于提升SQL查询性能和满足业务需求至关重要。

    mysql数据类型转换

    当需要将整型(如`INT`)转换为字符串类型(如`VARCHAR`)时,可以使用`CONCAT`函数来实现这一目标。 ```sql -- 示例:将整数8转换为字符串'80' SELECT CONCAT(8, '0'); ``` 或者将数字转换为`CHAR`类型: ``...

    从sqlserver数据库到MYSQL数据库转换操作指南

    从 SQL Server 数据库到 MySQL 数据库转换操作指南 在实际开发和数据分析中,数据库的选择和转换是非常常见的操作。随着业务的发展和技术的演进,数据库的选择和转换也变得越来越复杂。因此,本文将指导您从 SQL ...

    mysql varchar类型求和实例操作

    总结一下,MySQL中的`VARCHAR`类型求和可以通过`SUM()`函数(适用于简单场景)、`CAST()`或`CONVERT()`函数(适用于更复杂的数值转换)来实现。理解并熟练运用这些函数,能够帮助你在遇到类似问题时,有效地进行数据...

    递归查询菜单树,支持mysql,oracle

    这些技术通常提供API接口,将数据库查询结果转化为JSON格式,供前端渲染。 总的来说,递归查询菜单树是数据库操作的一个常见应用场景,它涉及到数据库设计、SQL查询技巧以及前后端的数据交换。理解并掌握这些知识点...

    pbootcms数据sqlite转mysql数据库

    1. **数据类型映射**:SQLite和MySQL的数据类型不尽相同,需要理解两者之间的映射规则,例如SQLite的`TEXT`可能对应MySQL的`VARCHAR`,`INTEGER PRIMARY KEY`对应`INT AUTO_INCREMENT`等。 2. **SQL语法差异**:...

    MySQL常用类型转换函数总结(推荐)

    将Int 转为varchar经常用 concat函数,比如concat(8,’0′) 得到字符串 ’80’  2、Cast函数;CONVERT函数。 用法:CAST(expr AS type), CONVERT(expr,type) , CONVERT(expr USING transcoding_name). SELECT ...

    简单了解mysql存储字段类型查询效率

    MySQL数据库在设计表结构时,选择正确的存储字段类型对于查询效率和存储空间的优化至关重要。以下是对标题和描述中提到的知识点的详细说明: 1. **整数类型**: - 整数类型包括TINYINT、SMALLINT、MEDIUMINT、INT...

    mysql转换到oracle数据库

    ### MySQL到Oracle数据库转换的关键知识点 #### 一、MySQL到Oracle数据库转换的总体流程 **1. 分表结构及表数据两次导出** - **原因**:由于MySQL与Oracle数据库之间的语法差异较大,一次性导出后直接进行转换...

    Mysql中文汉字转拼音的实现(每个汉字转换全拼)

    在MySQL中实现中文汉字转拼音的功能,主要是为了方便在数据库查询和数据分析时处理中文文本,尤其是在没有全文索引或者需要进行复杂模糊匹配时。以下是一个简单的实现方法,它利用自定义函数来完成这一任务。 首先...

    QT C++ 读写mySQL数据库 图片 例子 QT-MySQL-vchar-int-picture-demo.zip

    例如,MySQL中的VARCHAR对应QT的QString,INT对应int,图片通常存储为BLOB类型,可以存储二进制数据,如JPEG或PNG格式的图像。 6. **图片处理**:在QT中,QImage和QPixmap类用于处理图像数据。将图片保存到数据库前...

    从mysql转换到oracle数据库.docx

    MySQL 到 Oracle 数据库转换指南 在实际项目中,我们经常会遇到从 MySQL 转换到 Oracle 数据库的情况。这两种数据库有很多具体的应用不同,导致我们需要手动转换数据库结构和数据。本文将详细介绍从 MySQL 转换到 ...

Global site tag (gtag.js) - Google Analytics