mysqlselect中子查询中使用强制索引的优化案例_MySQL
1,朋友找我帮忙看下比较慢的sql语句
SELECT pg.product_goods_id, pg.product_id, pg.pdt_code, pg.pdt_name, pg.brand_name, pg.reference_price, pg.deposit, pg.sale_status, pg.is_delete, pg.create_date, pg.create_operator, pg.update_date, pg.update_operator, si.shop_id, si.shop_name, pg.goods_img_url, pg.is_bargain, pg.qr_code_url, ( SELECT COUNT(*) FROM product_attention pa WHERE pa.product_goods_id = pg.product_goods_id AND `status` = 0 ) AS laud, pc.category_name, pg.is_experience, pg.deposit, pg.buy_type, pg.content, pg.assure_flag, pg.market_price, pg.qty_cnt, pg.sales_cnt FROM product_goods pg LEFT JOIN shop_info si ON si.shop_id = pg.shop_id LEFT JOIN product_category pc ON pc.category_id = pg.category_id WHERE si.market_id IN (1, 2, 3, 12, 13) ORDER BY pg.update_date DESC , pg.product_goods_id DESC LIMIT 0, 20;
问题1,加上如下的子查询,比较慢
( SELECT COUNT(*) FROM product_attention pa WHERE pa.product_goods_id = pg.product_goods_id AND `status` = 0 ) AS laud,
这里加上去就有点慢,有什么优化办法么,询问有啥方法?
原blog地址:http://blog.csdn.net/mchdba/article/details/49667417,未经原作者同意,谢绝转载。
2,我让他提供了explain分析下执行结果
C:\Users\Administrator\Pictures\1105\e1.jpg
从中可以看到,pg表中用到了临时表空间也用到了filesort,这个点比较麻烦了。
3,我让他提供下涉及到的几个表的索引情况
、pa.jpg
、si.jpg
、pg.jpg
几个表的数据量都不大,product_goods 6w多条,其他3千多条。不应该这么慢的。
4,去掉order by后比较快的思考
我猜猜可能是order by引起的,我让去掉order by之后,他说比较快,但是这个order by不能轻易去掉,因为这是也许需要。但是order by字段里面有 product_goods_id。
5,解决方案:强制使用主键索引
分析到引起蛮的order by以及子查询里面都有product_goods_id字段,而且这个字段是pg表的主键,这么可以强制使用主键索引而不走shop_id的索引,我让他采用product_goods pg force index(PRI) 强制使用主键索引,我这样想,主要是因为这个语句的子查询用的是主键关联,但是explain的时候用的是shop_id的索引,我就怀疑是走了这个shop_id的索引导致的。如果不走这个shop_id字段的索引,直接走主键id既然兼顾到了join表链接又兼顾到了子查询了。
结果,他测试了后,发现快了许多,问题解决,expain结果如下ok.jpg所示,已经没有using temporary这一项了。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Windows 11 で 100% のディスク使用率を修正する方法 100% のディスク使用率を引き起こしている問題のあるアプリケーションまたはサービスを見つける簡単な方法は、タスク マネージャーを使用することです。タスク マネージャーを開くには、[スタート] メニューを右クリックし、[タスク マネージャー] を選択します。 [ディスク] 列ヘッダーをクリックして、最も多くのリソースを使用しているものを確認します。そこから、どこから始めればよいかがわかるでしょう。ただし、問題は単にアプリケーションを閉じたりサービスを無効にしたりするよりも深刻な場合があります。問題の潜在的な原因とその解決方法をさらに詳しくお読みください。 SuperfetchSuperfetch 機能 (Windows 11 では SysMain とも呼ばれる) を無効にすると、プリフェッチ ファイルにアクセスできるため、起動時間が短縮されます。

<h2>Windows 11 でファイルとフォルダーを検索から非表示にする方法</h2><p>最初に確認する必要があるのは、Windows Search ファイルの場所をカスタマイズすることです。これらの特定の場所をスキップすると、保護したいファイルを非表示にしながら、結果をより速く確認できるようになります。 </p><p>Windows 11 でファイルやフォルダーを検索から除外する場合は、次の手順を実行します: </p><ol&

Windows 11 で検索バーが機能しない場合は、すぐに検索バーを起動して実行できる簡単な方法がいくつかあります。どの Microsoft オペレーティング システムでも時折不具合が発生する可能性があり、最新のオペレーティング システムもこの規則から免除されません。さらに、Reddit でユーザー u/zebra_head1 が指摘したように、22H2Build22621.1413 を使用する Windows 11 でも同じエラーが表示されます。ユーザーからは、タスクバーの検索ボックスを切り替えるオプションがランダムに表示されなくなったと苦情が寄せられました。したがって、あらゆる状況に備えなければなりません。コンピューターの検索バーに入力できないのはなぜですか?コンピューターで入力できない場合は、さまざまな要因やプロセスが原因である可能性があります。注意すべき点がいくつかあります: Ctfmon。

Oracle インデックス タイプには次のものがあります: 1. B ツリー インデックス、2. ビットマップ インデックス、3. 関数インデックス、4. ハッシュ インデックス、5. 逆キー インデックス、6. ローカル インデックス、7. グローバル インデックス、8. ドメイン インデックス、9.ビットマップ接続インデックス、10. 複合インデックス。詳細な紹介: 1. B ツリー インデックスは、同時操作を効率的にサポートできる自己分散ツリー データ構造です。Oracle データベースでは、B ツリー インデックスが最も一般的に使用されるインデックス タイプです。2. ビット グラフ インデックスは、インデックス タイプ ベースです。ビットマップアルゴリズムなどについて。

Outlook で検索とインデックス作成のトラブルシューティング ツールを実行する 開始できるより簡単な修正の 1 つは、検索とインデックス作成のトラブルシューティング ツールを実行することです。 Windows 11 でトラブルシューティング ツールを実行するには: [スタート] ボタンをクリックするか、Windows キーを押してメニューから [設定] を選択します。 [設定] が開いたら、[システム] > [トラブルシューティング] > [追加のトラブルシューティング] を選択します。右側を下にスクロールし、「SearchandIndexing」を見つけて「実行」ボタンをクリックします。 [Outlook 検索] を選択すると結果が返されず、画面上の指示に進みます。実行すると、トラブルシューティングが自動的に問題を特定して修正します。トラブルシューティング ツールを実行した後、Outlook を開いて、検索が適切に機能しているかどうかを確認します。のように

解決策は次のとおりです。 1. インデックス値が正しいかどうかを確認します。まず、インデックス値が配列の長さの範囲を超えていないかどうかを確認します。配列のインデックスは 0 から始まるため、インデックスの最大値は配列の長さから 1 を引いた値になります。 2. ループ境界条件を確認します。ループ内で配列アクセスにインデックスを使用する場合は、ループ境界条件が正しいことを確認してください。 ; 3. 配列の初期化: 配列を使用する前に、配列が正しく初期化されていることを確認してください; 4. 例外処理の使用: プログラム内で例外処理メカニズムを使用して、インデックスが配列の境界を超えるエラーをキャッチできます。 、それに応じて処理してください。

この記事では、PHP がどのようにして、別の文字列内の文字列の開始位置から終了位置まで文字列を返すかを詳しく説明します。非常に実用的であると編集者が考えたので、参考として共有します。この記事. この記事から何かを得ることができます。 PHP で substr() 関数を使用して、文字列から部分文字列を抽出します。substr() 関数は、文字列から指定された範囲内の文字を抽出できます。構文は次のとおりです。 substr(string,start,length) ここで、 string: 部分文字列が抽出される元の文字列。 start: 部分文字列の開始位置のインデックス (0 から始まります)。 length (オプション): 部分文字列の長さ。指定されていない場合は、

インデックスを使用して、PHP および MySQL でのデータのグループ化とデータ集約の効率を向上させるにはどうすればよいでしょうか?はじめに: PHP と MySQL は現在最も広く使用されているプログラミング言語およびデータベース管理システムであり、Web アプリケーションの構築や大量のデータの処理によく使用されます。データのグループ化とデータの集計は、大量のデータを処理する際の一般的な操作ですが、インデックスが適切に設計および使用されていない場合、これらの操作は非常に非効率になる可能性があります。この記事では、PHP と MySQL でのデータのグループ化と集計の効率を向上させ、パフォーマンスを向上させるためのインデックスの使用方法を紹介します。
