Heim Datenbank MySQL-Tutorial MySQL5.7虚拟列实现表达式索引_MySQL

MySQL5.7虚拟列实现表达式索引_MySQL

May 30, 2016 pm 05:10 PM
索引 表达式

MySQL自古以来就不提供函数索引这么复杂的功能。那怎么在MySQL里面实现这样的功能呢? 我们先来看看函数索引的概念。函数索引,也可称为表达式索引,也就是基于字段以特定函数(表达式)建立索引来提升查询性能之需。函数索引的优势在于更加精确的获取所需要的数据。


MySQL 5.7提供了一个新的特性,虚拟列,可以很完美的解决这个问题。
在介绍虚拟列之前,我们来看看在MySQL里面普通索引的范例。
示例表结构:

CREATE TABLE t1 (id INT ,rank INT, log_time DATETIME, nickname VARCHAR(64)) ENGINE INNODB;
ALTER TABLE t1 ADD PRIMARY KEY (id), ADD KEY idx_rank (rank),ADD KEY idx_log_time (log_time);
Nach dem Login kopieren



示例表数据量,这里我增加了5000条记录:
mysql> select count(*) from t1;
+----------+
| count(*) |
+----------+
|     5000 |
+----------+
1 row in set (0.00 sec)
Nach dem Login kopieren




假设我们来检索2015年4月9号的数据。(结果是有两条记录,id 分别为95和3423。)


mysql> SELECT * FROM t1 WHERE DATE(log_time) = '2015-04-09'\G
*************************** 1. row ***************************
      id: 95
    rank: 24
log_time: 2015-04-09 05:53:13
nickname: test
*************************** 2. row ***************************
      id: 3423
    rank: 42
log_time: 2015-04-09 02:55:38
nickname: test
2 rows in set (0.01 sec)
Nach dem Login kopieren




下来我们看看这条语句的查询计划。

mysql> explain SELECT * FROM t1 WHERE DATE(log_time) = '2015-04-09'\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: t1
   partitions: NULL
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 5000
     filtered: 100.00
        Extra: Using where
1 row in set, 1 warning (0.00 sec)
Nach dem Login kopieren



我们发现TYPE是ALL,扫描的函数是5000,也就是说这条语句进行了一个全表扫描。 虽然给字段log_time 加了索引,但是没有用到,那这个时候怎么办?
在MySQL里面一般这样修改:
mysql> SELECT * FROM t1 WHERE log_time >= &#39;2015-04-09 00:00:00&#39; AND log_time <=&#39;2015-04-10 00:00:00&#39;\G
*************************** 1. row ***************************
      id: 3423
    rank: 42
log_time: 2015-04-09 02:55:38
nickname: test
*************************** 2. row ***************************
      id: 95
    rank: 24
log_time: 2015-04-09 05:53:13
nickname: test
2 rows in set (0.00 sec)
Nach dem Login kopieren




通过查询结果,发现结果集一致,那再来看看查询计划




mysql> explain SELECT * FROM t1 WHERE log_time >= &#39;2015-04-09 00:00:00&#39; AND log_time <= &#39;2015-04-10 00:00:00&#39;\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: t1
   partitions: NULL
         type: range
possible_keys: idx_log_time
          key: idx_log_time
      key_len: 6
          ref: NULL
         rows: 2
     filtered: 100.00
        Extra: Using index condition
1 row in set, 1 warning (0.00 sec)
Nach dem Login kopieren




可以看到这条修改过的语句很好的利用到了idx_log_time这条索引。


那好,这个是之前在MySQL 5.6以及之前的旧版本解决方法,随着MySQL 5.7的发布,虚拟列的出现让这个问题更加简单。
现在修改下之前的表结构:


ALTER TABLE t1 ADD COLUMN log_date  DATE AS (DATE(log_Time)) stored, ADD KEY idx_log_date (log_date);
Nach dem Login kopieren




这样,增加了一新列,用来存放date(log_time)这个表达式,并且给他加了一列索引。


那么,之前的语句就变成如下:
mysql> SELECT * FROM t1 WHERE log_date = &#39;2015-04-09&#39;\G
*************************** 1. row ***************************
      id: 95
    rank: 24
log_time: 2015-04-09 05:53:13
nickname: test
log_date: 2015-04-09
*************************** 2. row ***************************
      id: 3423
    rank: 42
log_time: 2015-04-09 02:55:38
nickname: test
log_date: 2015-04-09
2 rows in set (0.00 sec)
Nach dem Login kopieren




执行后结果集和之前的一致。


我们来看看查询计划,发现很好的利用了idx_log_date索引列。
mysql> explain  SELECT * FROM t1 WHERE log_date = &#39;2015-04-09&#39;\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: t1
   partitions: NULL
         type: ref
possible_keys: idx_log_date
          key: idx_log_date
      key_len: 4
          ref: const
         rows: 2
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.00 sec)
Nach dem Login kopieren



通过以上介绍,我们看到虚拟列实现起来相对之前的方法来的容易的多。但是这里笔者还是得说上几句。
函数索引的用法以及SQL语句虽然写起来简单,但是在大部分场合下,只能说不得已而为之,是一种设计上的缺陷,后期增加了运维人员的运维难度以及繁琐度。这也就是为什么MySQL 直到5.7才推出了这项类似的功能的原因。

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)

So beheben Sie eine 100-prozentige Festplattenauslastung unter Windows 11 So beheben Sie eine 100-prozentige Festplattenauslastung unter Windows 11 Apr 20, 2023 pm 12:58 PM

So beheben Sie eine 100-prozentige Festplattenauslastung unter Windows 11 Der einfachste Weg, die problematische Anwendung oder den problematischen Dienst zu finden, der eine 100-prozentige Festplattenauslastung verursacht, ist die Verwendung des Task-Managers. Um den Task-Manager zu öffnen, klicken Sie mit der rechten Maustaste auf das Startmenü und wählen Sie Task-Manager. Klicken Sie auf die Spaltenüberschrift „Datenträger“, um zu sehen, was die meisten Ressourcen verbraucht. Von dort aus haben Sie eine gute Vorstellung davon, wo Sie beginnen sollen. Das Problem kann jedoch schwerwiegender sein, als nur das Schließen einer Anwendung oder das Deaktivieren eines Dienstes. Lesen Sie weiter, um weitere mögliche Ursachen für Probleme und deren Behebung zu finden. Das Deaktivieren der Superfetch-Superfetch-Funktion (in Windows 11 auch als SysMain bekannt) trägt dazu bei, die Startzeit durch den Zugriff auf Prefetch-Dateien zu verkürzen

Wie verstecke ich Dateien und Ordner und entferne sie aus der Suche in Windows 11? Wie verstecke ich Dateien und Ordner und entferne sie aus der Suche in Windows 11? Apr 26, 2023 pm 11:07 PM

&lt;h2&gt;So verbergen Sie Dateien und Ordner vor der Suche unter Windows 11&lt;/h2&gt;&lt;p&gt;Das erste, was wir uns ansehen müssen, ist die Anpassung des Speicherorts der Windows-Suchdateien. Wenn Sie diese spezifischen Speicherorte überspringen, sollten Sie in der Lage sein, Ergebnisse schneller zu sehen und gleichzeitig alle Dateien auszublenden, die Sie schützen möchten. &lt;/p&gt;&lt;p&gt;Wenn Sie Dateien und Ordner von der Suche unter Windows 11 ausschließen möchten, führen Sie die folgenden Schritte aus: &lt;/p&gt;&lt;ol&

Hier sind 6 Möglichkeiten, das Problem zu beheben, dass die Suchleiste von Windows 11 nicht verfügbar ist. Hier sind 6 Möglichkeiten, das Problem zu beheben, dass die Suchleiste von Windows 11 nicht verfügbar ist. May 08, 2023 pm 10:25 PM

Wenn Ihre Suchleiste in Windows 11 nicht funktioniert, gibt es ein paar schnelle Möglichkeiten, sie im Handumdrehen zum Laufen zu bringen! Bei jedem Microsoft-Betriebssystem kann es von Zeit zu Zeit zu Störungen kommen, und die neuesten Betriebssysteme sind von dieser Regel nicht ausgenommen. Darüber hinaus tritt, wie der Benutzer u/zebra_head1 auf Reddit betonte, der gleiche Fehler unter Windows 11 mit 22H2Build22621.1413 auf. Benutzer haben sich darüber beschwert, dass die Option zum Umschalten des Suchfelds in der Taskleiste zufällig verschwunden ist. Daher müssen Sie auf jede Situation vorbereitet sein. Warum kann ich nichts in die Suchleiste auf meinem Computer eingeben? Die Unfähigkeit, am Computer zu tippen, kann auf unterschiedliche Faktoren und Prozesse zurückgeführt werden. Hier sind einige Dinge, die Sie beachten sollten: Ctfmon.

Was sind die Oracle-Indextypen? Was sind die Oracle-Indextypen? Nov 16, 2023 am 09:59 AM

Oracle-Indextypen umfassen: 1. B-Tree-Index; 3. Funktionsindex; Bitmap-Verbindungsindex; 10. Zusammengesetzter Index. Detaillierte Einführung: 1. Der B-Tree-Index ist eine selbstausgleichende Baumdatenstruktur, die gleichzeitige Vorgänge effizient unterstützen kann. In der Oracle-Datenbank ist der B-Tree-Index der am häufigsten verwendete Indextyp zum Bitmap-Algorithmus und so weiter.

Windows 11 Outlook-Suche funktioniert nicht: 6 Korrekturen Windows 11 Outlook-Suche funktioniert nicht: 6 Korrekturen Apr 22, 2023 pm 09:46 PM

Führen Sie die Fehlerbehebung für Suche und Indizierung in Outlook aus. Eine der einfacheren Lösungen, die Sie starten können, ist die Ausführung der Fehlerbehebung für Suche und Indizierung. So führen Sie die Fehlerbehebung unter Windows 11 aus: Klicken Sie auf die Schaltfläche „Start“ oder drücken Sie die Windows-Taste und wählen Sie „Einstellungen“ aus dem Menü. Wenn die Einstellungen geöffnet werden, wählen Sie System > Fehlerbehebung > Zusätzliche Fehlerbehebung. Scrollen Sie auf der rechten Seite nach unten, suchen Sie nach „SearchandIndexing“ und klicken Sie auf die Schaltfläche „Ausführen“. Wählen Sie „Outlook-Suche“, um keine Ergebnisse zurückzugeben, und fahren Sie mit den Anweisungen auf dem Bildschirm fort. Wenn Sie es ausführen, erkennt und behebt der Troubleshooter das Problem automatisch. Öffnen Sie nach dem Ausführen der Fehlerbehebung Outlook und prüfen Sie, ob die Suche ordnungsgemäß funktioniert. wie

So lösen Sie das Problem, dass der Index das Array-Limit überschreitet So lösen Sie das Problem, dass der Index das Array-Limit überschreitet Nov 15, 2023 pm 05:22 PM

Die Lösungen sind: 1. Überprüfen Sie, ob der Indexwert korrekt ist: Überprüfen Sie zunächst, ob Ihr Indexwert den Längenbereich des Arrays überschreitet. Der Index des Arrays beginnt bei 0, daher sollte der maximale Indexwert die Array-Länge minus 1 sein. Überprüfen Sie die Schleifenrandbedingungen: Wenn Sie Indizes für den Array-Zugriff in einer Schleife verwenden, stellen Sie sicher, dass die Schleifenrandbedingungen korrekt sind; 3. Initialisieren Sie das Array: Stellen Sie vor der Verwendung eines Arrays sicher, dass das Array korrekt initialisiert wurde. 4. Verwenden Sie die Ausnahmebehandlung: Sie können den Ausnahmebehandlungsmechanismus im Programm verwenden, um Fehler abzufangen, bei denen der Index die Grenzen des Arrays überschreitet. und entsprechend damit umgehen.

PHP gibt den String von der Startposition bis zur Endposition eines Strings in einem anderen String zurück PHP gibt den String von der Startposition bis zur Endposition eines Strings in einem anderen String zurück Mar 21, 2024 am 10:31 AM

In diesem Artikel wird ausführlich erläutert, wie PHP die Zeichenfolge von der Startposition zur Endposition einer Zeichenfolge in einer anderen Zeichenfolge zurückgibt. Der Herausgeber hält dies für recht praktisch, daher teile ich es Ihnen als Referenz mit diesem Artikel können Sie etwas abgewinnen. Verwenden Sie die Funktion substr() in PHP, um Teilzeichenfolgen aus einer Zeichenfolge zu extrahieren. Die Funktion substr() kann Zeichen innerhalb eines angegebenen Bereichs aus einer Zeichenfolge extrahieren. Die Syntax lautet wie folgt: substr(string,start,length) wobei: string: der ursprüngliche String, aus dem der Teilstring extrahiert werden soll. start: Der Index der Startposition des Teilstrings (beginnend bei 0). Länge (optional): Die Länge des Teilstrings. Wenn nicht angegeben, dann

Wie kann die Effizienz der Datengruppierung und Datenaggregation in PHP und MySQL durch Indizes verbessert werden? Wie kann die Effizienz der Datengruppierung und Datenaggregation in PHP und MySQL durch Indizes verbessert werden? Oct 15, 2023 am 11:39 AM

Wie kann die Effizienz der Datengruppierung und Datenaggregation in PHP und MySQL durch Indizes verbessert werden? Einführung: PHP und MySQL sind derzeit die am weitesten verbreiteten Programmiersprachen und Datenbankverwaltungssysteme und werden häufig zum Erstellen von Webanwendungen und zum Verarbeiten großer Datenmengen verwendet. Datengruppierung und Datenaggregation sind häufige Vorgänge bei der Verarbeitung großer Datenmengen. Wenn Indizes jedoch nicht ordnungsgemäß entworfen und verwendet werden, können diese Vorgänge sehr ineffizient werden. In diesem Artikel wird erläutert, wie Sie mithilfe von Indizes die Effizienz der Datengruppierung und Datenaggregation in PHP und MySQL verbessern und verbessern

See all articles