注: MySQL 実行計画を表示するには、SQL ステートメントを実行する前に Explain を追加します
データベース: MySQL によって公式に提供される sakila データベース
例: 最終支払い時刻をクエリ
explain select max(payment_date) from payment \G;
クエリの種類は単純で、インデックスは使用されません。スキャンされた行数は 10,000 行を超え、所要時間は 0.02 秒です
最適化方法:
payment_date 列にインデックスを作成します
create index idx_paydate on payment(payment_date);
次に、この SQL ステートメントを実行して検索します:
この実行結果の理由: インデックスが順番に配置されているため、インデックスを通じて最後のものが何であるかをすぐに知ることができます
例: 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パフォーマンスの最適化最大、カウントの最適化如下图所示
注:在执行SQL语句前加上explain可以查看MySQL的执行计划
数据库:MySQL官方提供的sakila数据库
例如:查询最后支付时间
explain select max(payment_date) from payment \G;
查询的类型为simple,没有用到任何索引,扫描行数为1万多行,用时0.02sec
优化方法:
在payment_date列建立索引
create index idx_paydate on payment(payment_date);
然后在执行此sql语句,发现:
此mysqlパフォーマンスの最適化最大、カウントの最適化的原因为:因为索引是顺序排列的,通过索引,就可以马上知道最后一个是什么
例如:在一条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 によって公式に提供される sakila データベース
例: 最終支払い時刻のクエリ
count(*) と <code>count(特定の列)
を実行します。 count(*)
には null が含まれており、もう一方が null の場合は実行されないため、結果が異なる場合があります。数えられる。 🎜この機能を利用すると、2006年以外の年はnullとして記録されます🎜🎜🎜🎜 上記はmysqlのパフォーマンス最適化のmaxとcountの最適化の内容です。 、PHP 中国語 Web サイト (www.php.cn) に注意してください。 🎜🎜🎜🎜🎜