ホームページ >データベース >mysql チュートリアル >mysqlパフォーマンスの最適化最大、カウントの最適化

mysqlパフォーマンスの最適化最大、カウントの最適化

黄舟
黄舟オリジナル
2017-02-27 11:48:002424ブラウズ


注: MySQL 実行計画を表示するには、SQL ステートメントを実行する前に Explain を追加します
データベース: MySQL によって公式に提供される sakila データベース

最大最適化:

例: 最終支払い時刻をクエリ

 explain select max(payment_date) from payment \G;

mysqlパフォーマンスの最適化最大、カウントの最適化

クエリの種類は単純で、インデックスは使用されません。スキャンされた行数は 10,000 行を超え、所要時間は 0.02 秒です

最適化方法:

payment_date 列にインデックスを作成します

create index idx_paydate on payment(payment_date);

次に、この SQL ステートメントを実行して検索します:

mysqlパフォーマンスの最適化最大、カウントの最適化

この実行結果の理由: インデックスが順番に配置されているため、インデックスを通じて最後のものが何であるかをすぐに知ることができます

カウントの最適化

例: 2006 年の映画の本数を求める1 つの SQL ステートメントで同時に 2006 年と 2007 年をそれぞれいくつにするか
間違った方法:

select count(release_year = '2006' OR release_year = '2007') from film;

2006 年と 2007 年の映画の数を別々に計算することはできません

select count(*) from film where release_year = '2006' and release_year = '2007'

release_year を 2006 年と 2007 年に同時にすることはできません。ロジックが間違っています

クエリの最適化は次のとおりです:

select count(release_year='2006' or null) as '2006年的电影数量',count(release_year='2007' or null) as '2007年的电影数量' from film;

説明、SQL では、count(*)count(a columns) の実行結果です。 count(*) には null が含まれており、もう一方が null の場合はカウントされません。 count(*)count(某列),mysqlパフォーマンスの最適化最大、カウントの最適化有时候会是不一样的,因为,count(*)包含为null的,而另个如果为null的话,则不计数在内。
利用这个特性,将为不是2006年的记为null,mysqlパフォーマンスの最適化最大、カウントの最適化如下图所示
mysqlパフォーマンスの最適化最大、カウントの最適化

注:在执行SQL语句前加上explain可以查看MySQL的执行计划
数据库:MySQL官方提供的sakila数据库

Max优化:

例如:查询最后支付时间

 explain select max(payment_date) from payment \G;

mysqlパフォーマンスの最適化最大、カウントの最適化

查询的类型为simple,没有用到任何索引,扫描行数为1万多行,用时0.02sec

优化方法:

在payment_date列建立索引

create index idx_paydate on payment(payment_date);

然后在执行此sql语句,发现:

mysqlパフォーマンスの最適化最大、カウントの最適化

此mysqlパフォーマンスの最適化最大、カウントの最適化的原因为:因为索引是顺序排列的,通过索引,就可以马上知道最后一个是什么

Count优化

例如:在一条SQL语句中同时查出2006年和2007年的电影数量分别是多少
错误方式:

select count(release_year = '2006' OR release_year = '2007') from film;

无法分开计算2006年和2007年的电影数量

select count(*) from film where release_year = '2006' and release_year = '2007'

release_year不能同时为2006和2007,因此逻辑上有误

查询优化如下:

select count(release_year='2006' or null) as '2006年的电影数量',count(release_year='2007' or null) as '2007年的电影数量' from film;

说明,在sql中,count(*)count(某列),mysqlパフォーマンスの最適化最大、カウントの最適化有时候会是不一样的,因为,count(*)この機能を使用すると、2006 年以外の年は null として記録され、実行結果は次の図のようになります

mysqlパフォーマンスの最適化最大、カウントの最適化

注: MySQL 実行計画を表示するには、SQL ステートメントを実行する前に Explain を追加します

データベース: MySQL によって公式に提供される sakila データベース

最大最適化:


例: 最終支払い時刻のクエリ

rrreee🎜🎜🎜🎜クエリの種類は単純で、インデックスは使用されず、スキャンされた行の数は 10,000 を超え、 0.02秒かかります🎜🎜最適化方法:🎜🎜payment_date列にインデックスを作成します🎜rrreee🎜次に、このSQLステートメントを実行して次を見つけます:🎜🎜🎜🎜🎜 この実行結果の理由は、インデックスが順番に配置されているためです。インデックスを作成すると、最後のものが何であるかをすぐに知ることができます🎜🎜カウントの最適化🎜🎜例: 1 つの SQL ステートメントで 2006 年と 2007 年の映画の数を同時に調べます🎜エラー メソッド:🎜rrreee🎜 の数を計算できません2006 年と 2007 年の映画を別々に🎜rrreee🎜release_year を 2006 年と 2007 年に同時にすることはできないため、ロジックが間違っています🎜🎜🎜クエリの最適化は次のとおりです:🎜rrreee🎜説明、SQL では、count(*) と <code>count(特定の列) を実行します。 count(*) には null が含まれており、もう一方が null の場合は実行されないため、結果が異なる場合があります。数えられる。 🎜この機能を利用すると、2006年以外の年はnullとして記録されます🎜🎜🎜🎜 上記はmysqlのパフォーマンス最適化のmaxとcountの最適化の内容です。 、PHP 中国語 Web サイト (www.php.cn) に注意してください。 🎜🎜🎜🎜🎜
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。