结合业务特性巧用临时表
拿到某开发sql如下SELECTp.products_idFROMproductsASpJOINproducts_to_categoriesASpcUSING(products_id)JOINcategoriesAScUSING(categories_id)JOINproducts_r
拿到某开发sql如下
SELECT p.products_id FROM products AS p JOIN products_to_categories AS pc USING(products_id) JOIN categories AS c USING(categories_id) JOIN products_realtime_quantity AS prq ON prq.sku_or_poa = p.products_model WHERE products_status =1 AND categories_status =1 AND prq.msg != 'Temporary out stock.' ORDER BY p.products_date_added DESC LIMIT 10一般看到这种sql,在where中只有status类似的字段(可选择性非常低,数据两极分化非常明显)而且需要order by的语句,我们就应该想到使用force index(order_by_column)来进行优化.
explian
+----+-------------+-------+--------+------------------------------+-------------------+---------+--------------------------------+--------+----------------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+--------+------------------------------+-------------------+---------+--------------------------------+--------+----------------------------------------------+ | 1 | SIMPLE | pc | index | PRIMARY,categories_id | PRIMARY | 8 | NULL | 1009510 | Using index; Using temporary; Using filesort | | 1 | SIMPLE | p | eq_ref | PRIMARY,products_model | PRIMARY | 4 | banggood_work.pc.products_id | 1 | Using where | | 1 | SIMPLE | c | eq_ref | PRIMARY | PRIMARY | 4 | banggood_work.pc.categories_id | 1 | Using where | | 1 | SIMPLE | prq | ref | ix_prg_sku_or_poa,ix_prq_msg | ix_prg_sku_or_poa | 152 | banggood_work.p.products_model | 1 | Using where | +----+-------------+-------+--------+------------------------------+-------------------+---------+--------------------------------+--------+----------------------------------------------+发现mysql优化器选择了pc表的主键,虽然使用了索引,但是进行了全索引扫描,效果还是不理想!
强制使用force index后,explain
EXPLAIN -> SELECT p.products_id FROM products AS p FORCE INDEX(products_date_added) -> JOIN products_to_categories AS pc USING(products_id) -> JOIN categories AS c USING(categories_id) -> JOIN products_realtime_quantity AS prq ON prq.sku_or_poa = p.products_model -> WHERE products_status =1 AND categories_status =1 AND prq.msg != 'Temporary out stock.' -> ORDER BY p.products_date_added DESC LIMIT 10 -> ; +----+-------------+-------+--------+------------------------------+---------------------+---------+--------------------------------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+--------+------------------------------+---------------------+---------+--------------------------------+------+-------------+ | 1 | SIMPLE | p | index | NULL | products_date_added | 8 | NULL | 1 | Using where | | 1 | SIMPLE | prq | ref | ix_prg_sku_or_poa,ix_prq_msg | ix_prg_sku_or_poa | 152 | banggood_work.p.products_model | 1 | Using where | | 1 | SIMPLE | pc | ref | PRIMARY,categories_id | PRIMARY | 4 | banggood_work.p.products_id | 1009 | Using index | | 1 | SIMPLE | c | eq_ref | PRIMARY | PRIMARY | 4 | banggood_work.pc.categories_id | 1 | Using where | +----+-------------+-------+--------+------------------------------+---------------------+---------+--------------------------------+------+-------------+发现索引已经变成productsw_date_added,而执行时间,前者是2s,后者是0.003s.
这是我们一贯的优化方法,但是我们可以根据sql语句的特性和业务特性,结合临时表进行一些淫邪的优化,虽然并不通用,但是可以开阔sql优化者的思维。
我们可以看到这条语句是需要根据产品添加时间拿取符合(products_status =1 AND categories_status =1 AND prq.msg != 'Temporary out stock.')条件的10个最新上架产品.而我们知道,最新上架的产品一般状态都是不可能马上下架,而且对应的类别id也是可用,而且库存也是充足的(要不然何必上架),这个特性站到了99.9%以上.所以,我们利用这个特性,,先从产品表中找出不带任何条件的200个产品,放到临时表,然后再用临时表结果集,和拿取条件进行匹配,取出最新的10条.
(200条是一个参考值,根据各自的逻辑特性来取)
sql如下
SELECT DISTINCT p.products_id FROM (SELECT products_id,products_model,products_status,products_date_added FROM products ORDER BY products_date_added DESC LIMIT 200 ) AS p JOIN products_to_categories AS pc USING(products_id) JOIN categories AS c USING(categories_id) JOIN products_realtime_quantity AS prq ON prq.sku_or_poa = p.products_model WHERE products_status =1 AND categories_status =1 AND prq.msg != 'Temporary out stock.' ORDER BY products_date_added DESC LIMIT 10;explain后发现
| 1 | PRIMARY |我们可以看到,已经利用products表中的products_date_added字段排序取出200条,整个sql语句变成一个只有200行的临时表驱动查询了,性能相对于原来的语句,提高上百倍!
执行时间大约是0.02s(可能比force index略慢)。
本文出自 “原下” 博客,请务必保留此出处

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

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

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











Le rôle principal de MySQL dans les applications Web est de stocker et de gérer les données. 1.MySQL traite efficacement les informations utilisateur, les catalogues de produits, les enregistrements de transaction et autres données. 2. Grâce à SQL Query, les développeurs peuvent extraire des informations de la base de données pour générer du contenu dynamique. 3.MySQL fonctionne basé sur le modèle client-serveur pour assurer une vitesse de requête acceptable.

Laravel est un cadre PHP pour la création facile des applications Web. Il fournit une gamme de fonctionnalités puissantes, notamment: Installation: Installez le Laravel CLI globalement avec Composer et créez des applications dans le répertoire du projet. Routage: définissez la relation entre l'URL et le gestionnaire dans Routes / web.php. Voir: Créez une vue dans les ressources / vues pour rendre l'interface de l'application. Intégration de la base de données: fournit une intégration prête à l'emploi avec des bases de données telles que MySQL et utilise la migration pour créer et modifier des tables. Modèle et contrôleur: le modèle représente l'entité de la base de données et le contrôleur traite les demandes HTTP.

MySQL et PHPMyAdmin sont de puissants outils de gestion de la base de données. 1) MySQL est utilisé pour créer des bases de données et des tables et pour exécuter des requêtes DML et SQL. 2) PHPMYADMIN fournit une interface intuitive pour la gestion des bases de données, la gestion de la structure de la table, les opérations de données et la gestion de l'autorisation des utilisateurs.

Par rapport à d'autres langages de programmation, MySQL est principalement utilisé pour stocker et gérer les données, tandis que d'autres langages tels que Python, Java et C sont utilisés pour le traitement logique et le développement d'applications. MySQL est connu pour ses performances élevées, son évolutivité et son support multiplateforme, adapté aux besoins de gestion des données, tandis que d'autres langues présentent des avantages dans leurs domaines respectifs tels que l'analyse des données, les applications d'entreprise et la programmation système.

J'ai rencontré un problème délicat lors du développement d'une petite application: la nécessité d'intégrer rapidement une bibliothèque d'opération de base de données légère. Après avoir essayé plusieurs bibliothèques, j'ai constaté qu'ils avaient trop de fonctionnalités ou ne sont pas très compatibles. Finalement, j'ai trouvé Minii / DB, une version simplifiée basée sur YII2 qui a parfaitement résolu mon problème.

Résumé de l'article: Cet article fournit des instructions détaillées étape par étape pour guider les lecteurs sur la façon d'installer facilement le cadre Laravel. Laravel est un puissant cadre PHP qui accélère le processus de développement des applications Web. Ce didacticiel couvre le processus d'installation des exigences du système à la configuration des bases de données et à la configuration du routage. En suivant ces étapes, les lecteurs peuvent jeter rapidement et efficacement une base solide pour leur projet Laravel.

Les opérations de base de MySQL incluent la création de bases de données, les tables et l'utilisation de SQL pour effectuer des opérations CRUD sur les données. 1. Créez une base de données: CreatedAtAbaseMy_First_DB; 2. Créez un tableau: CreateTableBooks (idIntauto_inCmentPrimaryKey, TitleVarchar (100) notnull, AuthorVarchar (100) notnull, publied_yearint); 3. Données d'insertion: INSERTINTOBOOKS (titre, auteur, publié_year) VA

Lors du développement d'un site Web de commerce électronique à l'aide de Thelia, j'ai rencontré un problème délicat: le mode MySQL n'est pas réglé correctement, ce qui fait que certaines fonctionnalités ne fonctionnent pas correctement. Après une certaine exploration, j'ai trouvé un module appelé TheliamysqlModeschecker, qui est capable de réparer automatiquement le motif MySQL requis par Thelia, résolvant complètement mes problèmes.
