ホームページ  >  記事  >  データベース  >  MySQL データベースの最適化 (5) - MySQL クエリの最適化

MySQL データベースの最適化 (5) - MySQL クエリの最適化

黄舟
黄舟オリジナル
2017-02-27 13:54:401675ブラウズ

1. MySQL クエリ タイプ (デフォルトですべてのデータ列がクエリされます)
1. 内部結合
デフォルトのマルチテーブル関連付けクエリ方法は、2 つのテーブルのすべてのフィールドを内部結合キーワードでクエリします。省略可能です
2. 特定のテーブル内のすべてのデータをクエリする外部結合
(1) 左結合
最初のテーブルのすべてのフィールドをクエリします
(2) 右結合
すべてのデータをクエリします2 番目のテーブルのフィールド、テーブル 1 の一致するデータが空の場合、null を返します

3. サブ接続

--内连接  查询出bookID=book类型ID的记录  
SELECT tb.bookName,tby.bookTypeName FROM t_book tb,t_bookType tby WHERE tb.bookTypeId=tby.id;

--外连接(左连接)
SELECT  tb.bookName,tby.bookTypeName FROM t_book LEFT JOIN t_bookType ON t_book.bookTypeId=t_bookType.id where ......;
--外连接(右连接)
SELECT  tb.bookName,tby.bookTypeName FROM t_book RIGHT JOIN t_bookType ON t_book.bookTypeId=t_bookType.id where ......;

--子查询
SELECT * FROM t_book WHERE booktypeId IN (SELECT id FROM t_booktype);
SELECT * FROM t_book WHERE booktypeId NOT IN (SELECT id FROM t_booktype);
SELECT * FROM t_book WHERE price>=(SELECT price FROM t_pricelevel WHERE priceLevel=1);
SELECT * FROM t_book WHERE EXISTS (SELECT * FROM t_booktype);
SELECT * FROM t_book WHERE NOT EXISTS (SELECT * FROM t_booktype);
SELECT * FROM t_book WHERE price>= ANY (SELECT price FROM t_pricelevel);
SELECT * FROM t_book WHERE price>= ALL (SELECT price FROM t_pricelevel);

2. クエリ最適化のアイデア
1. なぜ遅いですか?
クエリを最適化する前に、クエリが遅くなる原因を理解する必要があります。クエリが n 個のサブタスクで構成されるタスクとみなされる場合、サブタスクが増加すると、SQL 関連のクエリも増加します。クエリの最適化は、実際には、これらの n サブタスクを最適化することを意味し、一部のサブタスクを削除するか、サブタスクの実行数を減らします。
2. サブタスクとは何ですか?
Mysql には通常、クエリを実行するためのプロセスがいくつかあります。クライアントはクエリ ステートメントをサーバーに送信し、サーバーはクエリ ステートメントを解析し、実行プランを生成します。実行はサイクルの最も重要な段階であり、データベース エンジンの呼び出し、並べ替え、グループ化などのデータ処理プロセスが含まれます。
3. 最適化の方向性
1. クエリデータの最適化
非効率なクエリの基本的な理由: アクセスのために要求されるデータが多すぎるため、必然的に大量のスクリーニング作業が必要になります
エラー試行:

select * from t_user t inner join t_role r inner join t_permission p where .....

エラーの原因: 内部結合を使用して 3 つのテーブルのすべてのデータ列をクエリします
正しい方法:

select t.name,r.rolename,p.pname from t_user t inner join t_role r inner join t_permission p where

2. クエリを分割します
分割して征服し、複雑なクエリをそれぞれの小さなクエリに分割しますクエリは結果のごく一部のみを返します
エラー試行:

select * from t_user t where createData>DATE_SUB(NOW(),INTERVAL 3 MONTH)
                       delete from t_user t where createData>DATE_SUB(NOW(),INTERVAL 3 MONTH)

エラー理由: ユーザーテーブル内のデータ量が膨大な場合、1 回のクエリまたはテーブル内の大量のデータの削除待機一時停止が発生します。
3、関連付けクエリを分解する

エラー試行 テーブルが巨大な場合、テーブル内の大量のデータを 1 回限りのクエリまたは削除すると、待機時間が発生します
正しい方法:

select * from t_user where  t.age=10;
                       select t. rolename from t_user where ...
                       select t. pname from t_user where ...

       分解关联查询表面上好像原本1个sql就干完的事,现在非得由3个sql去完成,实际上它比关联查询更有优势:
(1)提高缓存效率:对于第一条查询中age=10这条记录的所有字段已经缓存在mysql中,供第二个查询语句使用
(2)减少单个查询间的锁竞争
(3)减少冗余字段的查询    
 
四、总结
     在平时的应用中,尤其在在java开发提供了良好的数据持久化框架,对于mysql的查询优化并未过分关系,并且在使用sql执行查询时,可能也经常使用到多表关联查询,在使用这些sql拼接的过程中,对于sql优化不能不知晓,在应对高并发问题中,除了在web服务器前做负载、平行扩展等措施之外,数据库高并发的解决方案也与其并重,而这一个一个sql就是应多高并发的优化基础,不容小觑。  

 以上就是MySQL数据库优化(五)—MySQL查询优化的内容,更多相关内容请关注PHP中文网(www.php.cn)!


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。