Maison base de données tutoriel mysql 错误使用MySQL前缀索引导致的慢查询问题_MySQL

错误使用MySQL前缀索引导致的慢查询问题_MySQL

Jun 01, 2016 pm 01:34 PM
项目

bitsCN.com

错误使用MySQL前缀索引导致的慢查询问题

 

前端时间跟一个DB相关的项目,alanc反馈有一个查询,使用索引比不使用索引慢很多倍,有点毁三观。所以跟进了一下,用explain,看了看2个查询不同的结果。

 

不用索引的查询的时候结果如下,实际查询中速度比较块。

 

mysql> explain select * from rosterusers limit 10000,3 ;

 

+----+-------------+-------------+------+---------------+------+---------+------+---------+-------+ 

| id | select_type | table       | type | possible_keys | key  | key_len | ref  | rows    | Extra | 

+----+-------------+-------------+------+---------------+------+---------+------+---------+-------+ 

|  1 | SIMPLE      | rosterusers | ALL  | NULL          | NULL | NULL    | NULL | 2010066 |       | 

+----+-------------+-------------+------+---------------+------+---------+------+---------+-------+

 

而使用索引order by的查询结果如下,速度反而慢的惊人。

 

mysql> explain select * from rosterusers order by username limit 10000,3 ;

 

+----+-------------+-------------+------+---------------+------+---------+------+---------+----------------+ 

| id | select_type | table       | type | possible_keys | key  | key_len | ref  | rows    | Extra          | 

+----+-------------+-------------+------+---------------+------+---------+------+---------+----------------+ 

|  1 | SIMPLE      | rosterusers | ALL  | NULL          | NULL | NULL    | NULL | 2010087 | Using filesort | 

+----+-------------+-------------+------+---------------+------+---------+------+---------+----------------+

 

区别在于,使用索引查询的Extra变成了,Using filesort。居然用了使用外部文件进行排序。这个当然慢了。

 

但数据表上在username,的确是有索引的。怎么会反而要Using filesort?

 

看了一下数据表定义。是一个开源聊天服务器ejabberd的一张表。初看以为主键i_rosteru_user_jid是username,和jid的联合索引,那么使用order by username时应该是可以使用到索引才对呀?

 

CREATE TABLE `rosterusers` (

 

`username` varchar(250) NOT NULL,

 

`jid` varchar(250) NOT NULL,

 

UNIQUE KEY `i_rosteru_user_jid` (`username`(75),`jid`(75)),

 

KEY `i_rosteru_jid` (`jid`)

 

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

仔细检查突然发现其主键定义,不是定义的完整的主键名称,而跟了一个75的长度描述,稍稍一愣,原来用的是前缀索引,而不是整个字段都是索引。(我的记忆里面InnoDB还不支持这玩意,估计是4.0后什么版本加入的),前缀索引就是将数据字段中前面N个字节作为索引的一种方式。。

 

发现了这个问题后,我们开始怀疑慢查询和这个索引有关,前缀索引的主要用途在于有时字段过程,而MySQL支持的很多索引长度是有限制的。

 

首先不带order by 的limit 这种查询,本质可能还是和主键相关的,因为MySQL 的INNODB的操作实际都是依靠主键的(即使你没有建立,系统也会有一个默认的),而limit这种查询,使用主键是可以加快速度,(explain返回的rows 应该是一个参考值),虽然我没有看见什么文档明确的说明过这个问题,但从不带order by 的limit 查询的返回结果基本可以证明这点。

 

但当我们使用order by username的时候,由于希望使用的是username的排序,而不是username(75)的排序,但实际索引是前缀索引,不是完整字段的索引。所以反而导致了order by的时候完全无法利用索引了。(我在SQL语句里面增加强制使用索引i_rosteru_user_jid也不起作用)。而其实使用中,表中的字段username 连75个都用不到,何况定义的250的长度。完全是自己折腾导致的麻烦。由于这是其他产品的表格,我们无法更改,暂时只能先将就用不不带排序的查询讲究。

 

总结:

 

前缀索引,并不是一个万能药,他的确可以帮助我们对一个写过长的字段上建立索引。但也会导致排序(order by ,group by)查询上都是无法使用前缀索引的。

任何时候,对于DB Schema定义,合理的规划自己的字段长度,字段类型都是首要的事情。

bitsCN.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
4 Il y a quelques semaines By DDD
R.E.P.O. Meilleurs paramètres graphiques
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

L'IA peut-elle vaincre le dernier théorème de Fermat ? Un mathématicien a abandonné 5 ans de sa carrière pour transformer 100 pages de preuve en code L'IA peut-elle vaincre le dernier théorème de Fermat ? Un mathématicien a abandonné 5 ans de sa carrière pour transformer 100 pages de preuve en code Apr 09, 2024 pm 03:20 PM

Le dernier théorème de Fermat, sur le point d'être conquis par l'IA ? Et la partie la plus significative de tout cela est que le dernier théorème de Fermat, que l’IA est sur le point de résoudre, vise précisément à prouver que l’IA est inutile. Autrefois, les mathématiques appartenaient au domaine de l’intelligence humaine pure ; aujourd’hui, ce territoire est déchiffré et piétiné par des algorithmes avancés. Image Le dernier théorème de Fermat est une énigme « notoire » qui intrigue les mathématiciens depuis des siècles. Cela a été prouvé en 1993, et les mathématiciens ont désormais un grand projet : recréer la preuve à l’aide d’ordinateurs. Ils espèrent que toute erreur logique dans cette version de la preuve pourra être vérifiée par un ordinateur. Adresse du projet : https://github.com/riccardobrasca/flt

Partagez un moyen simple de packager des projets PyCharm Partagez un moyen simple de packager des projets PyCharm Dec 30, 2023 am 09:34 AM

Partagez la méthode d'empaquetage de projet PyCharm simple et facile à comprendre. Avec la popularité de Python, de plus en plus de développeurs utilisent PyCharm comme outil principal pour le développement Python. PyCharm est un puissant environnement de développement intégré qui fournit de nombreuses fonctions pratiques pour nous aider à améliorer l'efficacité du développement. L’une des fonctions importantes est le packaging du projet. Cet article explique comment empaqueter des projets dans PyCharm d'une manière simple et facile à comprendre, et fournit des exemples de code spécifiques. Pourquoi packager des projets ? Développé en Python

Regardons de plus près PyCharm : un moyen rapide de supprimer des projets Regardons de plus près PyCharm : un moyen rapide de supprimer des projets Feb 26, 2024 pm 04:21 PM

Titre : En savoir plus sur PyCharm : Un moyen efficace de supprimer des projets Ces dernières années, Python, en tant que langage de programmation puissant et flexible, a été privilégié par de plus en plus de développeurs. Dans le développement de projets Python, il est crucial de choisir un environnement de développement intégré efficace. En tant qu'environnement de développement intégré puissant, PyCharm fournit aux développeurs Python de nombreuses fonctions et outils pratiques, notamment la suppression rapide et efficace des répertoires de projet. Ce qui suit se concentrera sur la façon d'utiliser la suppression dans PyCharm

Conseils pratiques PyCharm : convertir le projet en fichier EXE exécutable Conseils pratiques PyCharm : convertir le projet en fichier EXE exécutable Feb 23, 2024 am 09:33 AM

PyCharm est un puissant environnement de développement intégré Python qui fournit une multitude d'outils de développement et de configurations d'environnement, permettant aux développeurs d'écrire et de déboguer du code plus efficacement. Lors du processus d'utilisation de PyCharm pour le développement de projets Python, nous devons parfois regrouper le projet dans un fichier EXE exécutable pour l'exécuter sur un ordinateur sur lequel aucun environnement Python n'est installé. Cet article explique comment utiliser PyCharm pour convertir un projet en fichier EXE exécutable et donne des exemples de code spécifiques. tête

Comment créer une liste de courses dans l'application de rappels iOS 17 sur iPhone Comment créer une liste de courses dans l'application de rappels iOS 17 sur iPhone Sep 21, 2023 pm 06:41 PM

Comment créer une liste d'épicerie sur iPhone sous iOS17 Créer une liste d'épicerie dans l'application Rappels est très simple. Il vous suffit d'ajouter une liste et de la remplir avec vos éléments. L'application trie automatiquement vos articles en catégories et vous pouvez même travailler avec votre partenaire ou partenaire d'appartement pour dresser une liste de ce que vous devez acheter dans le magasin. Voici les étapes complètes pour ce faire : Étape 1 : activer les rappels iCloud Aussi étrange que cela puisse paraître, Apple dit que vous devez activer les rappels d'iCloud pour créer une liste d'épicerie sur iOS17. Voici les étapes à suivre : Accédez à l'application Paramètres sur votre iPhone et appuyez sur [votre nom]. Ensuite, sélectionnez je

Que faire s'il y a une erreur lors du démarrage du projet React Que faire s'il y a une erreur lors du démarrage du projet React Dec 27, 2022 am 10:36 AM

Solution à l'erreur lors du démarrage du projet React : 1. Entrez dans le dossier du projet, démarrez le projet et affichez le message d'erreur ; 2. Exécutez la commande « npm install » ou « npm install react-scripts » 3. Exécutez « npm install » ; @ant-design/ pro-field --save".

Basé sur le projet open source ChatGPT Web UI, créez rapidement votre propre site ChatGPT Basé sur le projet open source ChatGPT Web UI, créez rapidement votre propre site ChatGPT Apr 15, 2023 pm 07:43 PM

En tant que blogueur technologique, Fengfeng préfère toutes sortes de lancers. J'ai déjà introduit ChatGPT pour me connecter à WeChat, DingTalk et Knowledge Planet (si vous ne l'avez pas vu, vous pouvez lire l'article précédent récemment, lorsque j'ai regardé open). projets source, a découvert un projet ChatGPTWebUI. Pensant que je n'ai jamais connecté ChatGPT à WebUI auparavant, c'est vraiment bien d'avoir ce projet open source à utiliser. Voici les étapes d'installation pratiques à partager avec tout le monde. Le responsable de l'installation propose de nombreuses méthodes d'installation dans la documentation du projet Github, notamment l'installation manuelle, le déploiement de Docker et le déploiement à distance. Il est étonnant qu'en choisissant une méthode de déploiement, j'aie d'abord pensé à la simplicité.

Tutoriel PyCharm : Comment supprimer des éléments dans PyCharm ? Tutoriel PyCharm : Comment supprimer des éléments dans PyCharm ? Feb 24, 2024 pm 05:54 PM

PyCharm est un puissant environnement de développement intégré (IDE) Python qui fournit des fonctions riches pour aider les développeurs à écrire et à gérer des projets Python plus efficacement. Lors du développement de projets à l'aide de PyCharm, nous devons parfois supprimer certains projets qui ne sont plus nécessaires pour libérer de l'espace ou nettoyer la liste des projets. Cet article détaillera comment supprimer des projets dans PyCharm et fournira des exemples de code spécifiques. Comment supprimer un projet Ouvrez PyCharm et entrez dans l'interface de la liste de projets. Dans la liste des projets,

See all articles