search
HomeDatabaseMysql Tutorialsql update更新不同字段类型性能分析

MySQL在使用update更新数据时,如果条件字段的类型为数字型,但参数是字符型的而且该条件又匹配不到记录,就会引起严重的性能问题

。如下:

 代码如下 复制代码
1,update test007 set key1 = key1 + '1' where id = 200000;
2,update test007 set key1 = key1 + '1' where id = '200000';

注意上面查询语句区别在于参数的类型不同,前者为数字型,后者为字符型,同时id为200000这条记录是不存在的。

如果使用第二条查询,而且满足记录不存在,这条查询将出现严重的效率问题,测试情况如下:

二,测试实践
1,创建一张测试数据表test007

 代码如下 复制代码
CREATE TABLE `test007` (                                  
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,          
`key1` int(10) NOT NULL DEFAULT '0',                 
`key2` int(10) NOT NULL DEFAULT '0',                 
`key3` int(10) NOT NULL DEFAULT '0',                    
PRIMARY KEY (`id`)                                                        
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=gbk

2,创建测试数据

 代码如下 复制代码


$db = _connect("localhost","root","");
mysql__db("test");
set_time_limit(0);
$table = 'test007';
for($i=0;$i     $k1 = rand(10000,300000);
    $k2 = rand(0,3);
    $k3 = rand(1,100000);
    mysql_query("insert into $table (key1,key2,key3) values ('".$k1."','".$k2."','".$k3."')",$db);
}
?>


说明:创建1000000(100W)条记录,数据大小为16.2 MB

3,测试参数类型为数字型的情况

 代码如下 复制代码

mysql> update test007 set key1=key1+'1' where id=10000001;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0  Changed: 0  Warnings: 0

查询语句的性能情况
+----------------------+----------+
| Status               | Duration |
+----------------------+----------+
| starting             | 0.000104 |
| checking permissions | 0.000005 |
| Opening tables       | 0.000010 |
| System lock          | 0.013440 |
| Table lock           | 0.000004 |
| init                 | 0.000035 |
| Updating             | 0.000020 |
| end                  | 0.000034 |
| query end            | 0.000002 |
| freeing items        | 0.000028 |
| logging slow query   | 0.000001 |
| cleaning up          | 0.000005 |
+----------------------+----------+
12 rows in set (0.00 sec)

说明:主键id的字段类型为数字型

4,测试参数类型为字符型的情况

 代码如下 复制代码

mysql> update test007 set key1=key1+'1' where id='100000001';
Query OK, 0 rows affected (0.03 sec)
Rows matched: 0  Changed: 0  Warnings: 0

查询语句的性能情况
+----------------------+----------+
| Status               | Duration |
+----------------------+----------+
| starting             | 0.000108 |
| checking permissions | 0.000005 |
| Opening tables       | 0.029382 |
| System lock          | 0.000003 |
| Table lock           | 0.000003 |
| init                 | 0.000039 |
| Updating             | 0.000074 |
| end                  | 0.000022 |
| query end            | 0.000002 |
| freeing items        | 0.000033 |
| logging slow query   | 0.000001 |
| cleaning up          | 0.000001 |
+----------------------+----------+
12 rows in set (0.00 sec)

在使用UPDATE更新记录时,如果被更新的字段的类型和所赋的值不匹配时,MySQL将这个值转换为相应类型的值。如果这个字段是数值类型,而且所赋值超 过了这个数据类型的最大范围,那么MySQL就将这个值转换为这个范围最大或最小值。如果字符串太长,MySQL就将多余的字符串截去。如果设置非空字段 为空,那么将这个字段设置为它们的默认值,数字的默认值是0,字符串的默认值是空串(不是null,是"")。

由于测试环境数据量比较小,所以测试的结果不明显,但关键是在开发过程中一定要注意字段类型与参数类型的一致性,避免在特定情况下造成数据在更新和删除过程中的额外开销。

5,测试大数据量的情况,过程如下

 代码如下 复制代码

第一步:创建数据表
CREATE TABLE `test008` (                                  
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,          
`key1` int(10) NOT NULL DEFAULT '0',                 
`key2` text,                 
`key3` int(10) NOT NULL DEFAULT '0',                    
PRIMARY KEY (`id`)                                                        
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=gbk

第二步:创建测试数据
创建1000000(100W)条记录,数据大小为2.07 GB (2,224,000,000 字节)

第三步:两条查询性能比较
mysql> update test008 set key1=key1+'1' where id='100000001';
Query OK, 0 rows affected (0.03 sec)
Rows matched: 0  Changed: 0  Warnings: 0

mysql> update test008 set key1=key1+'1' where id=100000001;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0  Changed: 0  Warnings: 0

第四步:创建索引
mysql> alter table test008 add index key3 (key3);
Query OK, 1000000 rows affected (5 min 54.33 sec)
Records: 1000000  Duplicates: 0  Warnings: 0

第五步:测试不同的条件
mysql> update test008 set key1 = key1 + '1' where id='';
Query OK, 0 rows affected (0.01 sec)
Rows matched: 0  Changed: 0  Warnings: 0

mysql> update test008 set key1 = key1 + '1' where id='12321232123';
Query OK, 0 rows affected (44.58 sec)
Rows matched: 0  Changed: 0  Warnings: 0

mysql> update test008 set key1 = key1 + '1' where id=12321232123;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0  Changed: 0  Warnings: 0

mysql> update test008 set key1= key1+ '1' where id='test';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0  Changed: 0  Warnings: 0

注意:上面测试中部分条件已经超出id字段的范围

 

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
麒麟8000与骁龙处理器性能分析:细数强弱对比麒麟8000与骁龙处理器性能分析:细数强弱对比Mar 24, 2024 pm 06:09 PM

麒麟8000与骁龙处理器性能分析:细数强弱对比随着智能手机的普及和功能不断增强,处理器作为手机的核心组件也备受关注。目前市场上最为常见且性能出色的处理器品牌之一就是华为的麒麟系列和高通的骁龙系列。本文将围绕麒麟8000和骁龙处理器展开性能分析,探讨两者在各方面的强弱对比。首先,让我们来了解一下麒麟8000处理器。作为华为公司最新推出的旗舰处理器,麒麟8000

性能对比:Go语言与C语言的速度和效率性能对比:Go语言与C语言的速度和效率Mar 10, 2024 pm 02:30 PM

性能对比:Go语言与C语言的速度和效率在计算机编程领域,性能一直是开发者们关注的重要指标。在选择编程语言时,开发者通常会关注其速度和效率。Go语言和C语言作为两种流行的编程语言,被广泛用于系统级编程和高性能应用。本文将对比Go语言和C语言在速度和效率方面的表现,并通过具体的代码示例来展示它们之间的差异。首先,我们来看一下Go语言和C语言的概况。Go语言是由G

如何使用php扩展XDebug进行强大的调试和性能分析如何使用php扩展XDebug进行强大的调试和性能分析Jul 28, 2023 pm 07:45 PM

如何使用PHP扩展Xdebug进行强大的调试和性能分析引言:在开发PHP应用程序的过程中,调试和性能分析是必不可少的环节。而Xdebug是PHP开发者常用的一款强大的调试工具,它提供了一系列高级功能,如断点调试、变量跟踪、性能分析等。本文将介绍如何使用Xdebug进行强大的调试和性能分析,以及一些实用的技巧和注意事项。一、安装Xdebug在开始使用Xdebu

如何进行C++代码的性能分析?如何进行C++代码的性能分析?Nov 02, 2023 pm 02:36 PM

如何进行C++代码的性能分析?在开发C++程序时,性能是一个重要的考量因素。优化代码的性能可以提高程序的运行速度和效率。然而,想要优化代码,首先需要了解它的性能瓶颈在哪里。而要找到性能瓶颈,首先需要进行代码的性能分析。本文将介绍一些常用的C++代码性能分析工具和技术,帮助开发者找到代码中的性能瓶颈,以便进行优化。使用Profiling工具Profiling工

JavaScript中的代码优化和性能分析的工具和技巧JavaScript中的代码优化和性能分析的工具和技巧Jun 16, 2023 pm 12:34 PM

随着互联网技术的飞速发展,JavaScript作为一门广泛使用的前端语言,也越来越受到重视。然而,在处理大量数据或是复杂逻辑的时候,JavaScript的性能就会受到影响。为了解决这个问题,我们需要掌握一些代码优化和性能分析的工具和技巧。本文将为大家介绍一些常用的JavaScript代码优化和性能分析工具以及技巧。一、代码优化避免全局变量:全局变量会占用更多

如何使用性能分析工具对 Java 函数进行分析和优化?如何使用性能分析工具对 Java 函数进行分析和优化?Apr 29, 2024 pm 03:15 PM

Java性能分析工具可用于分析和优化Java函数的性能。选择性能分析工具:JVisualVM、VisualVM、JavaFlightRecorder(JFR)等。配置性能分析工具:设置采样率、启用事件。执行函数并收集数据:在启用分析工具后执行函数。分析性能数据:识别CPU使用率、内存使用率、执行时间、热点等瓶颈指标。优化函数:使用优化算法、重构代码、使用缓存等技术提高效率。

对Java Queue队列性能的分析和优化策略对Java Queue队列性能的分析和优化策略Jan 09, 2024 pm 05:02 PM

JavaQueue队列的性能分析与优化策略摘要:队列(Queue)是在Java中常用的数据结构之一,广泛应用于各种场景中。本文将从性能分析和优化策略两个方面来探讨JavaQueue队列的性能问题,并给出具体的代码示例。引言队列是一种先进先出(FIFO)的数据结构,可用于实现生产者-消费者模式、线程池任务队列等场景。Java提供了多种队列的实现,例如Arr

C++开发建议:如何进行C++代码的性能分析C++开发建议:如何进行C++代码的性能分析Nov 22, 2023 pm 08:25 PM

作为一名C++开发人员,性能优化是我们不可避免的任务之一。为了提高代码的执行效率和响应速度,我们需要了解C++代码的性能分析方法,以便更好地调试和优化代码。在本文中,我们将为您介绍一些常用的C++代码性能分析工具和技术。编译选项C++编译器提供了一些编译选项,可以用于优化代码的执行效率。其中,最常用的选项为-O,它可以告诉编译器进行代码优化。通常,我们会设置

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

Hot Tools

MantisBT

MantisBT

Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

Atom editor mac version download

Atom editor mac version download

The most popular open source editor

Dreamweaver Mac version

Dreamweaver Mac version

Visual web development tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 English version

SublimeText3 English version

Recommended: Win version, supports code prompts!