Fusion d'index mysql : un SQL peut utiliser plusieurs index
Veuillez indiquer la source de la réimpression : fusion d'index mysql : un sql peut utiliser plusieurs index
Avant-propos
La fusion d'index de MySQL n'est pas une nouvelle fonctionnalité. Il a été implémenté dès la version mysql5.0. La raison pour laquelle j'écris encore ce billet de blog est que de nombreuses personnes croient encore à tort qu'une instruction SQL ne peut utiliser qu'un seul index. Cet article illustrera comment utiliser la fusion d'index à travers quelques exemples.
Qu'est-ce que la fusion d'index
Jetons un coup d'œil à la description de la fusion d'index dans le document mysql :
The Index Merge method is used to retrieve rows with several range scans and to merge their results into one. The merge can produce unions, intersections, or unions-of-intersections of its underlying scans. This access method merges index scans from a single table; it does not merge scans across multiple tables.
1 La fusion d'index consiste à fusionner les analyses de plage de plusieurs index en un seul index.
2. Lors de la fusion d'index, les index seront d'abord combinés, croisés ou intersectés, puis combinés pour fusionner en un seul index.
3. Les index qui doivent être fusionnés ne peuvent appartenir qu'à une seule table. La fusion d'index ne peut pas être effectuée sur plusieurs tables.
Quels sont les avantages de l'utilisation de la fusion d'index
En termes simples, la fusion d'index permet à un SQL d'utiliser plusieurs index. Prenez d'abord l'intersection, l'union ou l'intersection, puis l'union de ces indices. Cela réduit le nombre de fois où il faut récupérer des données de la table de données et améliore l'efficacité des requêtes.
Comment confirmer que la fusion d'index est utilisée
Lors de l'utilisation d'explication pour exécuter une instruction SQL, si la fusion d'index est utilisée, index_merge sera affiché dans la colonne type du contenu de sortie et tous les index utilisés seront affichés dans la colonne clé. Comme suit :
Il existe les types suivants dans le champ supplémentaire d'explication :
Utiliser l'index d'union pour obtenir l'union
Utiliser sort_union pour trier d'abord les données récupérées par rowid, puis obtenir l'union
Utiliser intersect pour obtenir l'intersection
Vous constaterez qu'il n'y a pas de sort_intersect, car selon l'implémentation actuelle, si vous souhaitez récupérer l'intersection par index, vous devez vous assurer que l'ordre des données récupérées via l'index est cohérent avec l'ordre des rowid. Il n’est donc pas nécessaire de trier.
Exemple de fusion d'index sort_union
Structure du tableau de données
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
mysql> show create table test\G *************************** 1. row *************************** Table: test Create Table: CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `key1_part1` int(11) NOT NULL DEFAULT '0', `key1_part2` int(11) NOT NULL DEFAULT '0', `key2_part1` int(11) NOT NULL DEFAULT '0', `key2_part2` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `key1` (`key1_part1`,`key1_part2`), KEY `key2` (`key2_part1`,`key2_part2`) ) ENGINE=MyISAM AUTO_INCREMENT=18 DEFAULT CHARSET=utf8 1 row in set (0.00 sec) Copier après la connexion |
Données
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
mysql> select * from test; +----+------------+------------+------------+------------+ | id | key1_part1 | key1_part2 | key2_part1 | key2_part2 | +----+------------+------------+------------+------------+ | 1 | 1 | 1 | 1 | 1 | | 2 | 1 | 1 | 2 | 1 | | 3 | 1 | 1 | 2 | 2 | | 4 | 1 | 1 | 3 | 2 | | 5 | 1 | 1 | 3 | 3 | | 6 | 1 | 1 | 4 | 3 | | 7 | 1 | 1 | 4 | 4 | | 8 | 1 | 1 | 5 | 4 | | 9 | 1 | 1 | 5 | 5 | | 10 | 2 | 1 | 1 | 1 | | 11 | 2 | 2 | 1 | 1 | | 12 | 3 | 2 | 1 | 1 | | 13 | 3 | 3 | 1 | 1 | | 14 | 4 | 3 | 1 | 1 | | 15 | 4 | 4 | 1 | 1 | | 16 | 5 | 4 | 1 | 1 | | 17 | 5 | 5 | 1 | 1 | | 18 | 5 | 5 | 3 | 3 | | 19 | 5 | 5 | 3 | 1 | | 20 | 5 | 5 | 3 | 2 | | 21 | 5 | 5 | 3 | 4 | | 22 | 6 | 6 | 3 | 3 | | 23 | 6 | 6 | 3 | 4 | | 24 | 6 | 6 | 3 | 5 | | 25 | 6 | 6 | 3 | 6 | | 26 | 6 | 6 | 3 | 7 | | 27 | 1 | 1 | 3 | 6 | | 28 | 1 | 2 | 3 | 6 | | 29 | 1 | 3 | 3 | 6 | +----+------------+------------+------------+------------+ 29 rows in set (0.00 sec) Copier après la connexion |
使用索引合并的案例
1 2 3 4 5 6 7 8 9 10 11 12 13 |
mysql> explain select * from test where (key1_part1=4 and key1_part2=4) or (key2_part1=4 and key2_part2=4)\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: test type: index_merge possible_keys: key1,key2 key: key1,key2 key_len: 8,4 ref: NULL rows: 3 Extra: Using sort_union(key1,key2); Using where 1 row in set (0.00 sec) Copier après la connexion |
未使用索引合并的案例
1 2 3 4 5 6 7 8 9 10 11 12 13 |
mysql> explain select * from test where (key1_part1=1 and key1_part2=1) or key2_part1=4\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: test type: ALL possible_keys: key1,key2 key: NULL key_len: NULL ref: NULL rows: 29 Extra: Using where 1 row in set (0.00 sec) Copier après la connexion |
résumé sort_union
À partir des deux cas ci-dessus, vous pouvez constater que les instructions SQL du même mode peuvent parfois utiliser des index, et parfois ne pas pouvoir utiliser d'index. La possibilité d'utiliser l'index dépend du fait que l'optimiseur de requêtes MySQL pense que l'utilisation de l'index est plus rapide après avoir analysé les données statistiques.
Par conséquent, discuter simplement de la question de savoir si une instruction SQL peut utiliser des index est un peu unilatéral, et les données doivent également être prises en compte.
Cas d'utilisation de la fusion d'index syndicaux
Structure du tableau de données
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
mysql> show create table test\G *************************** 1. row *************************** Table: test Create Table: CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `key1_part1` int(11) NOT NULL DEFAULT '0', `key1_part2` int(11) NOT NULL DEFAULT '0', `key2_part1` int(11) NOT NULL DEFAULT '0', `key2_part2` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `key1` (`key1_part1`,`key1_part2`,`id`), KEY `key2` (`key2_part1`,`key2_part2`,`id`) ) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8 1 row in set (0.00 sec) Copier après la connexion |
数据结构和之前有所调整。主要调整有如下两方面:
1、引擎从myisam改为了innodb。
2、组合索引中增加了id,并把id放在最后。
数据
数据和上面的数据一样。
使用索引合并的案例
1 2 3 4 5 6 7 8 9 10 11 12 13 |
mysql> explain select * from test where (key1_part1=4 and key1_part2=4) or (key2_part1=4 and key2_part2=4)\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: test type: index_merge possible_keys: key1,key2 key: key1,key2 key_len: 8,8 ref: NULL rows: 2 Extra: Using union(key1,key2); Using where 1 row in set (0.00 sec) Copier après la connexion résumé syndical
Les mêmes données, la même instruction SQL, mais la structure de la table de données a été ajustée, de sort_union à union. Il y a plusieurs raisons : cas d'utilisation d'intersectionfusion d'index mysql : un sql peut utiliser plusieurs index Ce qui précède est la fusion d'index mysql :Un SQL peut utiliser le contenu de plusieurs index. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) ! 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 UndressApplication basée sur l'IA pour créer des photos de nu réalistes ![]() AI Clothes RemoverOutil d'IA en ligne pour supprimer les vêtements des photos. ![]() Undress AI ToolImages de déshabillage gratuites ![]() Clothoff.ioDissolvant de vêtements AI ![]() AI Hentai GeneratorGénérez AI Hentai gratuitement. ![]() Article chaud
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines
By 尊渡假赌尊渡假赌尊渡假赌
Assassin's Creed Shadows: Solution d'énigmes de coquille
1 Il y a quelques semaines
By DDD
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines
By 尊渡假赌尊渡假赌尊渡假赌
Où trouver la courte de la grue à atomide atomique
1 Il y a quelques semaines
By DDD
![]() Outils chauds![]() Bloc-notes++7.3.1Éditeur de code facile à utiliser et gratuit ![]() SublimeText3 version chinoiseVersion chinoise, très simple à utiliser ![]() Envoyer Studio 13.0.1Puissant environnement de développement intégré PHP ![]() Dreamweaver CS6Outils de développement Web visuel ![]() SublimeText3 version MacLogiciel d'édition de code au niveau de Dieu (SublimeText3) ![]() Les principales raisons pour lesquelles vous ne pouvez pas vous connecter à MySQL en tant que racines sont des problèmes d'autorisation, des erreurs de fichier de configuration, des problèmes de mot de passe incohérents, des problèmes de fichiers de socket ou une interception de pare-feu. La solution comprend: vérifiez si le paramètre Bind-Address dans le fichier de configuration est configuré correctement. Vérifiez si les autorisations de l'utilisateur racine ont été modifiées ou supprimées et réinitialisées. Vérifiez que le mot de passe est précis, y compris les cas et les caractères spéciaux. Vérifiez les paramètres et les chemins d'autorisation du fichier de socket. Vérifiez que le pare-feu bloque les connexions au serveur MySQL. ![]() Dans la base de données MySQL, la relation entre l'utilisateur et la base de données est définie par les autorisations et les tables. L'utilisateur a un nom d'utilisateur et un mot de passe pour accéder à la base de données. Les autorisations sont accordées par la commande Grant, tandis que le tableau est créé par la commande Create Table. Pour établir une relation entre un utilisateur et une base de données, vous devez créer une base de données, créer un utilisateur, puis accorder des autorisations. ![]() Lorsque MySQL modifie la structure du tableau, les verrous de métadonnées sont généralement utilisés, ce qui peut entraîner le verrouillage du tableau. Pour réduire l'impact des serrures, les mesures suivantes peuvent être prises: 1. Gardez les tables disponibles avec le DDL en ligne; 2. Effectuer des modifications complexes en lots; 3. Opérez pendant les périodes petites ou hors pointe; 4. Utilisez des outils PT-OSC pour obtenir un contrôle plus fin. ![]() Simplification de l'intégration des données: AmazonrDSMysQL et l'intégration Zero ETL de Redshift, l'intégration des données est au cœur d'une organisation basée sur les données. Les processus traditionnels ETL (extrait, converti, charge) sont complexes et prennent du temps, en particulier lors de l'intégration de bases de données (telles que AmazonrDSMysQL) avec des entrepôts de données (tels que Redshift). Cependant, AWS fournit des solutions d'intégration ETL Zero qui ont complètement changé cette situation, fournissant une solution simplifiée et à temps proche pour la migration des données de RDSMySQL à Redshift. Cet article plongera dans l'intégration RDSMYSQL ZERO ETL avec Redshift, expliquant comment il fonctionne et les avantages qu'il apporte aux ingénieurs de données et aux développeurs. ![]() MySQL a une version communautaire gratuite et une version d'entreprise payante. La version communautaire peut être utilisée et modifiée gratuitement, mais le support est limité et convient aux applications avec des exigences de stabilité faibles et des capacités techniques solides. L'Enterprise Edition fournit une prise en charge commerciale complète pour les applications qui nécessitent une base de données stable, fiable et haute performance et disposées à payer pour le soutien. Les facteurs pris en compte lors du choix d'une version comprennent la criticité des applications, la budgétisation et les compétences techniques. Il n'y a pas d'option parfaite, seulement l'option la plus appropriée, et vous devez choisir soigneusement en fonction de la situation spécifique. ![]() 1. Utilisez l'index correct pour accélérer la récupération des données en réduisant la quantité de données numérisées SELECT * FROMMLOYEESEESHWHERELAST_NAME = 'SMITH'; Si vous recherchez plusieurs fois une colonne d'une table, créez un index pour cette colonne. If you or your app needs data from multiple columns according to the criteria, create a composite index 2. Avoid select * only those required columns, if you select all unwanted columns, this will only consume more server memory and cause the server to slow down at high load or frequency times For example, your table contains columns such as created_at and updated_at and timestamps, and then avoid selecting * because they do not require inefficient query se ![]() MySQL ne peut pas fonctionner directement sur Android, mais il peut être implémenté indirectement en utilisant les méthodes suivantes: à l'aide de la base de données légère SQLite, qui est construite sur le système Android, ne nécessite pas de serveur distinct et a une petite utilisation des ressources, qui est très adaptée aux applications de périphériques mobiles. Connectez-vous à distance au serveur MySQL et connectez-vous à la base de données MySQL sur le serveur distant via le réseau pour la lecture et l'écriture de données, mais il existe des inconvénients tels que des dépendances de réseau solides, des problèmes de sécurité et des coûts de serveur. ![]() Guide d'optimisation des performances de la base de données MySQL dans les applications à forte intensité de ressources, la base de données MySQL joue un rôle crucial et est responsable de la gestion des transactions massives. Cependant, à mesure que l'échelle de l'application se développe, les goulots d'étranglement des performances de la base de données deviennent souvent une contrainte. Cet article explorera une série de stratégies efficaces d'optimisation des performances MySQL pour garantir que votre application reste efficace et réactive dans des charges élevées. Nous combinerons des cas réels pour expliquer les technologies clés approfondies telles que l'indexation, l'optimisation des requêtes, la conception de la base de données et la mise en cache. 1. La conception de l'architecture de la base de données et l'architecture optimisée de la base de données sont la pierre angulaire de l'optimisation des performances MySQL. Voici quelques principes de base: sélectionner le bon type de données et sélectionner le plus petit type de données qui répond aux besoins peut non seulement économiser un espace de stockage, mais également améliorer la vitesse de traitement des données. ![]() |