MySQL延迟关联性能优化方法_MySQL
【背景】
某业务数据库load 报警异常,cpu usr 达到30-40 ,居高不下。使用工具查看数据库正在执行的sql ,排在前面的大部分是:
代码如下:
SELECT id, cu_id, name, info, biz_type, gmt_create, gmt_modified,start_time, end_time, market_type, back_leaf_category,item_status,picuture_url FROM relation where biz_type ='0' AND end_time >='2014-05-29' ORDER BY id asc LIMIT 149420 ,20;
表的数据量大致有36w左右,该sql是一个非常典型的排序+分页查询:order by col limit N,OFFSET M , MySQL 执行此类sql时需要先扫描到N行,然后再去取 M行。对于此类大数据量的排序操作,取前面少数几行数据会很快,但是越靠后,sql的性能就会越差,因为N越大,MySQL 需要扫描不需要的数据然后在丢掉,这样耗费大量的时间。
【分析】
针对limit 优化有很多种方式,
1 前端加缓存,减少落到库的查询操作
2 优化SQL
3 使用书签方式 ,记录上次查询最新/大的id值,向后追溯 M行记录。
4 使用Sphinx 搜索优化。
对于第二种方式 我们推荐使用"延迟关联"的方法来优化排序操作,何谓"延迟关联" :通过使用覆盖索引查询返回需要的主键,再根据主键关联原表获得需要的数据。
【解决】
根据延迟关联的思路,修改SQL 如下:
优化前
代码如下:
root@xxx 12:33:48>explain SELECT id, cu_id, name, info, biz_type, gmt_create, gmt_modified,start_time, end_time, market_type, back_leaf_category,item_status,picuture_url FROM relation where biz_type =\'0\' AND end_time >=\'2014-05-29\' ORDER BY id asc LIMIT 149420 ,20;
+----+-------------+-------------+-------+---------------+-------------+---------+------+--------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------+-------+---------------+-------------+---------+------+--------+-----------------------------+
| 1 | SIMPLE | relation | range | ind_endtime | ind_endtime | 9 | NULL | 349622 | Using where; Using filesort |
+----+-------------+-------------+-------+---------------+-------------+---------+------+--------+-----------------------------+
1 row in set (0.00 sec)
其执行时间:
优化后:
代码如下:
SELECT a.* FROM relation a, (select id from relation where biz_type ='0' AND end_time >='2014-05-29' ORDER BY id asc LIMIT 149420 ,20 ) b where a.id=b.id
代码如下:
root@xxx 12:33:43>explain SELECT a.* FROM relation a, (select id from relation where biz_type ='0' AND end_time >='2014-05-29' ORDER BY id asc LIMIT 149420 ,20 ) b where a.id=b.id;
+----+-------------+-------------+--------+---------------+---------+---------+------+--------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------+--------+---------------+---------+---------+------+--------+-------+
| 1 | PRIMARY |
| 1 | PRIMARY | a | eq_ref | PRIMARY | PRIMARY | 8 | b.id | 1 | |
| 2 | DERIVED | relation | index | ind_endtime | PRIMARY | 8 | NULL | 733552 | |
+----+-------------+-------------+--------+---------------+---------+---------+------+--------+-------+
3 rows in set (0.36 sec)
执行时间:
优化后 执行时间 为原来的1/3 。

Outils d'IA chauds

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

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

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

Sujets chauds

Les performances des requêtes MySQL peuvent être optimisées en créant des index qui réduisent le temps de recherche d'une complexité linéaire à une complexité logarithmique. Utilisez PreparedStatements pour empêcher l’injection SQL et améliorer les performances des requêtes. Limitez les résultats des requêtes et réduisez la quantité de données traitées par le serveur. Optimisez les requêtes de jointure, notamment en utilisant des types de jointure appropriés, en créant des index et en envisageant l'utilisation de sous-requêtes. Analyser les requêtes pour identifier les goulots d'étranglement ; utiliser la mise en cache pour réduire la charge de la base de données ; optimiser le code PHP afin de minimiser les frais généraux.

Afin d'améliorer les performances des applications Go, nous pouvons prendre les mesures d'optimisation suivantes : Mise en cache : Utilisez la mise en cache pour réduire le nombre d'accès au stockage sous-jacent et améliorer les performances. Concurrence : utilisez des goroutines et des canaux pour exécuter des tâches longues en parallèle. Gestion de la mémoire : gérez manuellement la mémoire (à l'aide du package non sécurisé) pour optimiser davantage les performances. Pour faire évoluer une application, nous pouvons mettre en œuvre les techniques suivantes : Mise à l'échelle horizontale (mise à l'échelle horizontale) : déploiement d'instances d'application sur plusieurs serveurs ou nœuds. Équilibrage de charge : utilisez un équilibreur de charge pour distribuer les requêtes à plusieurs instances d'application. Partage de données : distribuez des ensembles de données volumineux sur plusieurs bases de données ou nœuds de stockage pour améliorer les performances et l'évolutivité des requêtes.

La création d'une table MySQL à l'aide de PHP nécessite les étapes suivantes : Connectez-vous à la base de données. Créez la base de données si elle n'existe pas. Sélectionnez une base de données. Créer un tableau. Exécutez la requête. Fermez la connexion.

L'un des changements majeurs introduits dans MySQL 8.4 (la dernière version LTS en 2024) est que le plugin « MySQL Native Password » n'est plus activé par défaut. De plus, MySQL 9.0 supprime complètement ce plugin. Ce changement affecte PHP et d'autres applications

L'optimisation des performances pour l'architecture de microservices Java inclut les techniques suivantes : Utiliser les outils de réglage JVM pour identifier et ajuster les goulots d'étranglement des performances. Optimisez le garbage collector et sélectionnez et configurez une stratégie GC qui correspond aux besoins de votre application. Utilisez un service de mise en cache tel que Memcached ou Redis pour améliorer les temps de réponse et réduire la charge de la base de données. Utilisez une programmation asynchrone pour améliorer la simultanéité et la réactivité. Divisez les microservices, en divisant les grandes applications monolithiques en services plus petits pour améliorer l'évolutivité et les performances.

PHP fournit les méthodes suivantes pour supprimer des données dans les tables MySQL : Instruction DELETE : utilisée pour supprimer les lignes correspondant aux conditions de la table. Instruction TRUNCATETABLE : utilisée pour effacer toutes les données de la table, y compris les ID auto-incrémentés. Cas pratique : Vous pouvez supprimer des utilisateurs de la base de données à l'aide de formulaires HTML et de code PHP. Le formulaire soumet l'ID utilisateur et le code PHP utilise l'instruction DELETE pour supprimer l'enregistrement correspondant à l'ID de la table des utilisateurs.

La configuration d'un pool de connexions MySQL à l'aide de PHP peut améliorer les performances et l'évolutivité. Les étapes comprennent : 1. Installer l'extension MySQLi ; 2. Créer une classe de pool de connexions ; 3. Définir la configuration du pool de connexions ; 4. Créer une instance de pool de connexions ; Grâce au regroupement de connexions, les applications peuvent améliorer les performances en évitant de créer une nouvelle connexion à la base de données pour chaque requête.

Améliorez les performances de PHP en permettant à OPCache de mettre en cache le code compilé. Utilisez un framework de mise en cache tel que Memcached pour stocker les données fréquemment utilisées. Réduisez les requêtes de base de données (par exemple en mettant en cache les résultats des requêtes). Optimisez le code (par exemple, utilisez des fonctions en ligne). Utilisez des outils d'analyse des performances tels que XHProf pour identifier les goulots d'étranglement des performances.
