Heim Datenbank MySQL-Tutorial 类型转换对MySQL选择索引的影响_MySQL

类型转换对MySQL选择索引的影响_MySQL

Jun 01, 2016 pm 01:44 PM
影响

bitsCN.com

遇到了几例 MySQL 没用使用预期索引的问题,读了些文档之后,发现 MySQL 的类型转换对索引选择的影响还真是一个不大不小的坑。

比如有这样一张 MySQL 表:

CREATE TABLE `indextest` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(10) DEFAULT NULL,
`age` tinyint(3) unsigned NOT NULL DEFAULT ’0′,
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_name` (`name`),
KEY `idx_age` (`age`),
KEY `idx_create` (`create_time`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1

name 是一个有索引的 varchar 字段,表内数据是这样的:

+—-+——–+—–+———————+
| id | name | age | create_time |
+—-+——–+—–+———————+
| 1 | hello | 10 | 2012-02-01 20:00:00 |
| 2 | world | 20 | 2012-02-02 20:00:00 |
| 3 | 111222 | 30 | 2012-02-03 20:00:00 |
| 4 | wow | 40 | 2012-02-04 20:00:00 |
+—-+——–+—–+———————+

使用字符串 ’111222′ 作为参数对 name 字段查询,Execution Plan 如预期的一样,会使用 name 字段上的索引 idx_name:

mysql [localhost] {msandbox} (test) > explain select age from
-> indextest where name=’111222′/G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: indextest
type: ref
possible_keys: idx_name
key: idx_name
key_len: 13
ref: const
rows: 1
Extra: Using where
1 row in set (0.00 sec)

而使用数字作为参数对 name 字段做查询时,explain 表明这将是全表扫描:

mysql [localhost] {msandbox} (test) > explain select age from
-> indextest where name=111222/G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: indextest
type: ALL
possible_keys: idx_name
key: NULL
key_len: NULL
ref: NULL
rows: 4
Extra: Using where
1 row in set (0.00 sec)

究其原因,是当文本字段与数字进行比较时,由于类型不同,MySQL 需要做隐式类型转换才能进行比较,结果就如上面的例子所提到的一样。

MySQL 的文档 (Type Conversion in Expression Evaluation) 中提到,在做比较时,会按这样的规则进行必要的类型转换:

两个参数至少有一个是 NULL 时,比较的结果也是 NULL,例外是使用 对两个 NULL 做比较时会返回 1,这两种情况都不需要做类型转换
两个参数都是字符串,会按照字符串来比较,不做类型转换
两个参数都是整数,按照整数来比较,不做类型转换
十六进制的值和非数字做比较时,会被当做二进制串,和数字做比较时会按下面的规则处理
有一个参数是 TIMESTAMP 或 DATETIME,并且另外一个参数是常量,常量会被转换为 timestamp
有一个参数是 decimal 类型,如果另外一个参数是 decimal 或者整数,会将整数转换为 decimal 后进行比较,如果另外一个参数是浮点数,则会把 decimal 转换为浮点数进行比较
所有其他情况下,两个参数都会被转换为浮点数再进行比较
比如:

mysql [localhost] {msandbox} (test) > SELECT ’18015376320243459′ =
-> 18015376320243459;
+—————————————–+
| ’18015376320243459′ = 18015376320243459 |
+—————————————–+
| 0 |
+—————————————–+
1 row in set (0.00 sec)

mysql [localhost] {msandbox} (test) > SELECT ’18015376320243459′ + 0;
+————————-+
| ’18015376320243459′ + 0 |
+————————-+
| 1.80153763202435e+16 |
+————————-+
1 row in set (0.00 sec)
mysql [localhost] {msandbox} (test) > SELECT
-> cast(’18015376320243459′ as unsigned) = 18015376320243459;
+———————————————————–+
| cast(’18015376320243459′ as unsigned) = 18015376320243459 |
+———————————————————–+
| 1 |
+———————————————————–+
1 row in set (0.00 sec)

因为浮点数精度(53 bits)问题,并且 MySQL 将字符串转换为浮点数和将整数转换为浮点数使用不同的方法,字符串 ’18015376320243459′ 和整数 18015376320243459 相比较就不相等,如果要避免隐式浮点数转换带来的精度问题,可以显式地使用 cast 做类型转换,将字符串转换为整数。

按照这些规则,对于上面的例子来说,name 字段的值和查询参数 ’111222′ 都会被转换为浮点数才会做比较,而很多文本都能转换为和 111222 相等的数值,比如 ’111222′, ’111222aabb’, ‘ 111222′ 和 ’11122.2e1′,所以 MySQL 不能有效使用索引,就退化为索引扫描甚至是全表扫描。

而反过来,如果使用一个字符串作为查询参数,对一个数字字段做比较查询,MySQL 则是可以有效利用索引的:

mysql [localhost] {msandbox} (test) > explain select name from
-> indextest where age=’30′/G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: indextest
type: ref
possible_keys: idx_age
key: idx_age
key_len: 1
ref: const
rows: 1
Extra:
1 row in set (0.00 sec)

原因则是,MySQL 可以将查询参数 ’30′ 转换为确定的数值 30,之后可以快速地在索引中找到与之相等的数值。

除此之外,使用函数对索引字段做显式类型转换或者计算也会使 MySQL 无法使用索引:

mysql [localhost] {msandbox} (test) > explain select name from
-> indextest where cast(age as unsigned)=30/G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: indextest
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 4
Extra: Using where
1 row in set (0.00 sec)

如上,使用 cast 函数对 age 做显式的类型转换,会使索引失效,当然了,在实际的代码中很少会有这样的写法,但类似下面这样对时间字段做运算的用法就比较多了:

mysql [localhost] {msandbox} (test) > explain select * from
-> indextest where date(create_time)=’2012-02-02′/G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: indextest
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 4
Extra: Using where
1 row in set (0.00 sec)

对于本例的需求,是想查找 create_time 是 2012-02-02 这一天的记录,用变通的方法,避免在索引字段上做运算就可以有效使用索引了:

mysql [localhost] {msandbox} (test) > explain select * from
-> indextest where create_time between ’2012-02-02′ and ’2012-02-03′/G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: indextest
type: range
possible_keys: idx_create
key: idx_create
key_len: 4
ref: NULL
rows: 1
Extra: Using where
1 row in set (0.00 sec)

MySQL 的 How … 系列文档值得读一读,比如:

  • How MySQL Uses Indexes
  • How MySQL Uses Memory
  • How MySQL Uses Internal Temporary Tables
  • How to Cope with Deadlocks
  • How MySQL Opens and Closes Tables
  • How MySQL Uses Threads for Client Connections
  • How to Determine What is Causing a Problem

伟大开源软件的文档总是需要经过反复阅读,才能逐步被理解和正确运用,RTFM 和 RTFS 的光辉无限

bitsCN.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

VBOX_E_OBJECT_NOT_FOUND(0x80bb0001)VirtualBox-Fehler VBOX_E_OBJECT_NOT_FOUND(0x80bb0001)VirtualBox-Fehler Mar 24, 2024 am 09:51 AM

Wenn Sie versuchen, ein Disk-Image in VirtualBox zu öffnen, wird möglicherweise eine Fehlermeldung angezeigt, die darauf hinweist, dass die Festplatte nicht registriert werden kann. Dies geschieht normalerweise, wenn die VM-Disk-Image-Datei, die Sie öffnen möchten, dieselbe UUID wie eine andere virtuelle Disk-Image-Datei hat. In diesem Fall zeigt VirtualBox den Fehlercode VBOX_E_OBJECT_NOT_FOUND(0x80bb0001) an. Wenn dieser Fehler auftritt, machen Sie sich keine Sorgen, es gibt einige Lösungen, die Sie ausprobieren können. Zunächst können Sie versuchen, mit den Befehlszeilentools von VirtualBox die UUID der Disk-Image-Datei zu ändern, um Konflikte zu vermeiden. Sie können den Befehl „VBoxManageinternal“ ausführen

Wie effektiv ist der Empfang von Telefonanrufen im Flugzeugmodus? Wie effektiv ist der Empfang von Telefonanrufen im Flugzeugmodus? Feb 20, 2024 am 10:07 AM

Was passiert, wenn jemand im Flugzeugmodus anruft? Mobiltelefone sind zu einem unverzichtbaren Werkzeug im Leben der Menschen geworden. Es ist nicht nur ein Kommunikationsmittel, sondern auch eine Sammlung von Unterhaltungs-, Lern-, Arbeits- und anderen Funktionen. Mit der kontinuierlichen Weiterentwicklung und Verbesserung der Mobiltelefonfunktionen werden die Menschen immer abhängiger von Mobiltelefonen. Mit der Einführung des Flugmodus können Menschen ihre Telefone während des Fluges bequemer nutzen. Manche Menschen sind jedoch besorgt darüber, welche Auswirkungen die Anrufe anderer Personen im Flugmodus auf das Mobiltelefon oder den Benutzer haben werden. In diesem Artikel werden verschiedene Aspekte analysiert und diskutiert. Erste

Wie schalte ich die Kommentarfunktion auf TikTok aus? Was passiert nach dem Deaktivieren der Kommentarfunktion auf TikTok? Wie schalte ich die Kommentarfunktion auf TikTok aus? Was passiert nach dem Deaktivieren der Kommentarfunktion auf TikTok? Mar 23, 2024 pm 06:20 PM

Auf der Douyin-Plattform können Nutzer nicht nur ihre Lebensmomente teilen, sondern auch mit anderen Nutzern interagieren. Manchmal kann die Kommentarfunktion zu unangenehmen Erlebnissen führen, wie z. B. Online-Gewalt, böswilligen Kommentaren usw. Wie kann man also die Kommentarfunktion von TikTok deaktivieren? 1. Wie schalte ich die Kommentarfunktion von Douyin aus? 1. Melden Sie sich bei der Douyin-App an und geben Sie Ihre persönliche Homepage ein. 2. Klicken Sie unten rechts auf „I“, um das Einstellungsmenü aufzurufen. 3. Suchen Sie im Einstellungsmenü nach „Datenschutzeinstellungen“. 4. Klicken Sie auf „Datenschutzeinstellungen“, um die Benutzeroberfläche für Datenschutzeinstellungen aufzurufen. 5. Suchen Sie in der Benutzeroberfläche für Datenschutzeinstellungen nach „Kommentareinstellungen“. 6. Klicken Sie auf „Kommentareinstellungen“, um die Kommentareinstellungsoberfläche aufzurufen. 7. Suchen Sie in der Benutzeroberfläche für Kommentareinstellungen nach der Option „Kommentare schließen“. 8. Klicken Sie auf die Option „Kommentare schließen“, um abschließende Kommentare zu bestätigen.

Sicherheitslücken bei der Dateieinbindung in Java und ihre Auswirkungen Sicherheitslücken bei der Dateieinbindung in Java und ihre Auswirkungen Aug 08, 2023 am 10:30 AM

Java ist eine häufig verwendete Programmiersprache zur Entwicklung verschiedener Anwendungen. Allerdings weist Java, genau wie andere Programmiersprachen, Sicherheitslücken und Risiken auf. Eine der häufigsten Schwachstellen ist die Dateieinschluss-Schwachstelle (FileInclusionVulnerability). In diesem Artikel werden das Prinzip, die Auswirkungen und die Vermeidung dieser Schwachstelle untersucht. Schwachstellen bei der Dateieinbindung beziehen sich auf die dynamische Einführung oder Aufnahme anderer Dateien in das Programm, die eingeführten Dateien werden jedoch nicht vollständig überprüft und geschützt

Die Auswirkungen der Datenknappheit auf das Modelltraining Die Auswirkungen der Datenknappheit auf das Modelltraining Oct 08, 2023 pm 06:17 PM

Die Auswirkungen der Datenknappheit auf das Modelltraining erfordern spezifische Codebeispiele. In den Bereichen maschinelles Lernen und künstliche Intelligenz sind Daten eines der Kernelemente für das Training von Modellen. Ein Problem, mit dem wir in der Realität jedoch häufig konfrontiert sind, ist die Datenknappheit. Unter Datenknappheit versteht man die unzureichende Menge an Trainingsdaten oder das Fehlen annotierter Daten. In diesem Fall hat dies einen gewissen Einfluss auf das Modelltraining. Das Problem der Datenknappheit spiegelt sich hauptsächlich in den folgenden Aspekten wider: Überanpassung: Wenn die Menge an Trainingsdaten nicht ausreicht, ist das Modell anfällig für Überanpassung. Überanpassung bezieht sich auf eine übermäßige Anpassung des Modells an die Trainingsdaten.

Welche Probleme verursachen fehlerhafte Sektoren auf der Festplatte? Welche Probleme verursachen fehlerhafte Sektoren auf der Festplatte? Feb 18, 2024 am 10:07 AM

Fehlerhafte Sektoren auf einer Festplatte beziehen sich auf einen physischen Fehler der Festplatte, d. h. die Speichereinheit auf der Festplatte kann Daten nicht normal lesen oder schreiben. Die Auswirkungen fehlerhafter Sektoren auf die Festplatte sind sehr erheblich und können zu Datenverlust, Systemabsturz und verminderter Festplattenleistung führen. In diesem Artikel werden die Auswirkungen fehlerhafter Festplattensektoren und die damit verbundenen Lösungen ausführlich vorgestellt. Erstens können fehlerhafte Sektoren auf der Festplatte zu Datenverlust führen. Wenn ein Sektor auf einer Festplatte fehlerhafte Sektoren aufweist, können die Daten in diesem Sektor nicht gelesen werden, was dazu führt, dass die Datei beschädigt wird oder nicht mehr zugänglich ist. Diese Situation ist besonders schwerwiegend, wenn wichtige Dateien in dem Sektor gespeichert sind, in dem sich die fehlerhaften Sektoren befinden.

Welchen konkreten Einfluss haben Minenkarten auf das Spiel? Welchen konkreten Einfluss haben Minenkarten auf das Spiel? Jan 03, 2024 am 09:05 AM

Einige Benutzer denken vielleicht aus Kostengründen über den Kauf von Mining-Karten nach, aber einige Spieler sind besorgt über die Auswirkungen von Mining-Karten auf das Spielen. Werfen wir einen Blick auf die ausführliche Einführung unten. Welche Auswirkungen hat die Verwendung einer Mining-Karte zum Spielen? 1. Die Stabilität von Spielen mit einer Mining-Karte kann nicht garantiert werden, da die Lebensdauer der Mining-Karte sehr kurz ist und sie nach dem bloßen Spielen wahrscheinlich unbrauchbar wird. 2. Die Mining-Karte ist im Grunde eine kastrierte Version der Originalversion. Aufgrund langfristiger Abnutzung kann die Leistung in allen Aspekten schwach sein. 3. Auf diese Weise können Benutzer beim Spielen möglicherweise nicht alle Effekte des Spiels anzeigen. 4. Darüber hinaus altern die elektronischen Komponenten der Grafikkarte im Voraus, ganz zu schweigen davon, dass das Spielen auch die Grafikkarte verbraucht, sodass sie stärker entladen wird, was große Auswirkungen auf das Spiel hat. 5. Verwenden Sie im Allgemeinen Mining-Karten zum Spielen

Welche Auswirkungen haben Gehäuselecks auf den Computer? Welche Auswirkungen haben Gehäuselecks auf den Computer? Feb 22, 2024 pm 06:48 PM

Welche Auswirkungen haben Gehäuselecks auf Computer? Mit der kontinuierlichen Weiterentwicklung der Technologie sind Computer nach und nach zu einem unverzichtbaren Werkzeug im Leben der Menschen geworden, sie sind untrennbar mit der Nutzung von Computern verbunden. Doch während wir den Komfort genießen, den Computer mit sich bringen, müssen wir auch auf seine Sicherheit achten. Gehäuselecks sind ein potenzielles Problem, das, wenn es nicht rechtzeitig behoben wird, schwerwiegende Auswirkungen auf den Computer und den Benutzer haben kann. Erstens führt eine Gehäuseleckage zu Schäden an der Computerhardware. Das Motherboard, die Stromversorgung, die internen Schaltkreise und andere Komponenten des Computers befinden sich alle im Gehäuse

See all articles