SQL优化索引的实操与功能

Jun 07, 2016 pm 04:11 PM
sql 主要 導入 最適化 関数 記事 索引

以下的文章主要介绍的是SQL优化索引问题,在一般的数据库中,用MySQLSQL优化索引来对相关数据库进行优化的使用率是相当高的。以下的文章主要是通过索引通常可以帮助我们解决大多数的SQL性能问题。 1. 索引的存储分类 MyISAM存储引擎的表的数据和索引时自动分

以下的文章主要介绍的是SQL优化索引问题,在一般的数据库中,用MySQLSQL优化索引来对相关数据库进行优化的使用率是相当高的。以下的文章主要是通过索引通常可以帮助我们解决大多数的SQL性能问题。

1. 索引的存储分类

MyISAM存储引擎的表的数据和索引时自动分开存储的,各自是独立的一个文件;InnoDB存储引擎的表的数据和索引时存储在同一表空间里面,但可以有多个文件组成。

MySQL中索引的存储类型目前只有两种(BTREE和HASH),具体和表的存储引擎相关;MyISAM和InnoDB存储引擎都只支持BTREE索引;MEMORY/HEAP存储引擎可以支持HASH和BTREE索引。

MySQL目前不支持函数索引,但是能对列的前面某一部分进行索引,例如name字段,可以以只取name的前4个字符进行MySQLSQL优化索引,这个特征可以大大缩小索引文件的大小。在设计表结构的时候也可以对文本列根据此特性进行灵活设计。例如

引用

<ol class="dp-xml"><li class="alt"><span><span>create index ind_company2_name on company2(name(4))  </span></span></li></ol>
ログイン後にコピー
ログイン後にコピー

2. MySQL如何使用索引

索引用于快速找出在某个列中有一特定值的行。对相关列使用索引时提高SELECT操作性能的最佳途径。
查询要使用索引最主要的条件是查询条件中需要使用索引关键字,如果是多列索引,那么只有查询条件使用了多列关

SQL优化索引问题

一般在数据中,很多朋友很喜欢用MySQLSQL优化索引来对数据库优化。通过索引通常可以帮助我们解决大多数的SQL性能问题。

1. 索引的存储分类

MyISAM存储引擎的表的数据和索引时自动分开存储的,各自是独立的一个文件;InnoDB存储引擎的表的数据和索引时存储在同一表空间里面,但可以有多个文件组成。

MySQL中索引的存储类型目前只有两种(BTREE和HASH),具体和表的存储引擎相关;MyISAM和InnoDB存储引擎都只支持BTREE索引;MEMORY/HEAP存储引擎可以支持HASH和BTREE索引。

MySQL目前不支持函数索引,但是能对列的前面某一部分进行索引,例如name字段,可以以只取name的前4个字符进行MySQLSQL优化索引,这个特征可以大大缩小索引文件的大小。在设计表结构的时候也可以对文本列根据此特性进行灵活设计。例如

引用

<ol class="dp-xml"><li class="alt"><span><span>create index ind_company2_name on company2(name(4))  </span></span></li></ol>
ログイン後にコピー
ログイン後にコピー

2. MySQL如何使用索引

索引用于快速找出在某个列中有一特定值的行。对相关列使用索引时提高SELECT操作性能的最佳途径。

查询要使用索引最主要的条件是查询条件中需要使用索引关键字,如果是多列索引,那么只有查询条件使用了多列关键字最左边的前缀时,才可以使用索引,否则将不能使用索引。

1. 使用索引

在MySQL中,下列几种情况下可能使用索引。

对于创建的多列索引,只要查询的条件中用到了最左边的列,MySQLSQL优化索引一般就会使用。

例如:

引用

我们首先按company_id ,Moneys的顺序创建一个复合索引

<ol class="dp-xml"><li class="alt"><span><span>create index ind_sales2_companyid_moneys on sales2(company_id,moneys)  </span></span></li></ol>
ログイン後にコピー

如果按company_id进行表查询

引用

使用explain来分析下

<ol class="dp-xml">
<li class="alt"><span><span>explain select * from sales2 where </span><span class="attribute">company_id</span><span> =</span><span class="attribute-value">2000</span><span> \G;   </span></span></li>
<li>
<span>explain select * from sales2 where </span><span class="attribute">moneys</span><span> = </span><span class="attribute-value">1</span><span>\G;  </span>
</li>
</ol>
ログイン後にコピー

通过上面你可以发现即便where条件中不是用company_id 和 moneys的组合条件,索引仍然能用到,这就是索引的前缀特性。但是如果只按照moneys条件查询表,那么索引就不会被用到。

对于使用like的查询,后面如果是常量并且只有%号不在第一字符,MySQLSQL优化索引才能会被使用例如

引用

<ol class="dp-xml">
<li class="alt"><span><span>explain select * from company2 where name like "%3"\G;   </span></span></li>
<li><span>explain select * from company2 where name like "3%"\G;  </span></li>
</ol>
ログイン後にコピー

以上两句你可以认为是一样的。其实是不一样的。第一句其实没有用到索引,而第二句才能够利用到索引。另外如果like后面跟的是一个列的名字,那么索引也不会被使用。

如果对大是文本进行搜索,使用全文索引而不用使用like"%..%"

如果列名是索引,使用column_name is null 将使用索引如

查询name为nll的记录就用到了索引

引用

<ol class="dp-xml"><li class="alt"><span><span>explain select * from company2 where name is null \G;  </span></span></li></ol>
ログイン後にコピー

2. 下面一些情况存在索引但不使用索引,你可能认为它会用,但是实际上它就是没用。

引用

1. 如果Mysql估计使用索引比全表扫描更慢,则不使用索引。

例如列key_part1均匀分布在1和100之间,下列查询中使用索引就不是很好

<ol class="dp-xml"><li class="alt"><span><span>select * from table_name where key_part1 </span><span class="tag">></span><span> 1 and key_part1 </span><span class="tag"><span> </span><span class="tag-name">90</span><span>;  </span></span></span></li></ol>
ログイン後にコピー

2. 如果使用MEMORY/HEAP表并且where条件中不使用"="进行索引列,那么不会用到索引。heap表只有在" ="的条件下才会使用索引

3. 用or分割开的条件,如果or前的条件中的列有索引,而后面的列中没用索引,那么涉及的索引都不会被用到

4. 如果不是索引列的第一部分,那么也不会使用。

5. 如果like是以"%"开始

6. 如果列类型是字符串,那么一定记得在where条件中把字符常量值用引号引起来,否则即便这个列上有索引,Mysql也不会使用。因为MYSQL默认把输入的常量值进行转换以后才进行检索。

最后查看索引使用情况

如果索引正在工作,Handler_read_key的值将很高,这个值代表了一个行被MySQLSQL优化索引值读的次数,很低的值表明增加索引得到的性能改善不高,因为索引经常不被使用到。Handler_read_rnd_next的值高则说明查询运行低效,并且应该建立索引补救。

这个值的含义是在数据文件中读取下一行的请求数。如果正进行大量的表扫描,Handler_read_rnd_next的值较高,则通常说明表索引不正确或者写入的查询没有利用索引。

还记得怎么看Handler_read_rnd_next 吗? 使用

<ol class="dp-xml"><li class="alt"><span><span>show statuts like 'Handler_read_%';  </span></span></li></ol>
ログイン後にコピー

键字最左边的前缀时,才可以使用索引,否则将不能使用索引。

1. 使用索引
在MySQL中,下列几种情况下可能使用索引。
对于创建的多列索引,只要查询的条件中用到了最左边的列,MySQLSQL优化索引一般就会使用。
例如:

引用

我们首先按company_id ,Moneys的顺序创建一个复合索引 

<ol class="dp-xml"><li class="alt"><span><span>create index ind_sales2_companyid_moneys on sales2(company_id,moneys)  </span></span></li></ol>
ログイン後にコピー

如果按company_id进行表查询

引用

使用explain来分析下 

<ol class="dp-xml">
<li class="alt"><span><span>explain select * from sales2 where </span><span class="attribute">company_id</span><span> =</span><span class="attribute-value">2000</span><span> \G;   </span></span></li>
<li>
<span>explain select * from sales2 where </span><span class="attribute">moneys</span><span> = </span><span class="attribute-value">1</span><span>\G;  </span>
</li>
</ol>
ログイン後にコピー

通过上面你可以发现即便where条件中不是用company_id 和 moneys的组合条件,索引仍然能用到,这就是索引的前缀特性。但是如果只按照moneys条件查询表,那么索引就不会被用到。

对于使用like的查询,后面如果是常量并且只有%号不在第一字符,MySQLSQL优化索引才能会被使用例如

引用

<ol class="dp-xml">
<li class="alt"><span><span>explain select * from company2 where name like "%3"\G;   </span></span></li>
<li><span>explain select * from company2 where name like "3%"\G;  </span></li>
</ol>
ログイン後にコピー

以上两句你可以认为是一样的。其实是不一样的。第一句其实没有用到索引,而第二句才能够利用到索引。另外如果like后面跟的是一个列的名字,那么索引也不会被使用。

如果对大是文本进行搜索,使用全文索引而不用使用like"%..%"

如果列名是索引,使用column_name is null 将使用索引如

查询name为nll的记录就用到了索引


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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Hibernate フレームワークにおける HQL と SQL の違いは何ですか? Hibernate フレームワークにおける HQL と SQL の違いは何ですか? Apr 17, 2024 pm 02:57 PM

HQL と SQL は Hibernate フレームワークで比較されます。HQL (1. オブジェクト指向構文、2. データベースに依存しないクエリ、3. タイプ セーフティ)、SQL はデータベースを直接操作します (1. データベースに依存しない標準、2. 複雑な実行可能ファイル)。クエリとデータ操作)。

C++ プログラムの最適化: 時間の複雑さを軽減する手法 C++ プログラムの最適化: 時間の複雑さを軽減する手法 Jun 01, 2024 am 11:19 AM

時間計算量は、入力のサイズに対するアルゴリズムの実行時間を測定します。 C++ プログラムの時間の複雑さを軽減するためのヒントには、適切なコンテナー (ベクター、リストなど) を選択して、データのストレージと管理を最適化することが含まれます。クイックソートなどの効率的なアルゴリズムを利用して計算時間を短縮します。複数の操作を排除して二重カウントを削減します。条件分岐を使用して、不必要な計算を回避します。二分探索などのより高速なアルゴリズムを使用して線形探索を最適化します。

ドージコインとは ドージコインとは Apr 01, 2024 pm 04:46 PM

Dogecoin は、インターネット ミームに基づいて作成された暗号通貨であり、固定供給上限がなく、速い取引時間、低い取引手数料、そして大規模なミーム コミュニティを備えています。用途には、少額の取引、チップ、慈善寄付が含まれます。しかし、その無限の供給、市場のボラティリティ、ジョークコインとしての地位は、リスクと懸念ももたらします。ドージコインとは何ですか? Dogecoin は、インターネットのミームやジョークに基づいて作成された暗号通貨です。起源と歴史: Dogecoin は、2 人のソフトウェア エンジニア、ビリー マーカスとジャクソン パーマーによって 2013 年 12 月に作成されました。当時人気だった「Doge」ミームからインスピレーションを得た、片言の英語を話す柴犬をフィーチャーしたコミカルな写真。特徴と利点: 無制限の供給: ビットコインなどの他の暗号通貨とは異なります。

Samsung S24aiの機能を詳しく紹介 Samsung S24aiの機能を詳しく紹介 Jun 24, 2024 am 11:18 AM

2024 年は AI 携帯電話元年です。AI スマート テクノロジーにより、携帯電話はますます効率的かつ便利に使用できるようになります。最近、今年の初めにリリースされたGalaxy S24シリーズは、生成AIエクスペリエンスを再び改善しました。以下で詳細な機能の紹介を見てみましょう。 1. 生成 AI は Samsung Galaxy S24 シリーズを強力に強化します。Galaxy S24 シリーズは、Galaxy AI によって強化され、多くのインテリジェント アプリケーションをもたらします。これらの機能は Samsung One UI6.1 と緊密に統合されており、ユーザーはいつでも便利なインテリジェントなエクスペリエンスを得ることができ、パフォーマンスが大幅に向上します。携帯電話の効率と使いやすさ。 Galaxy S24 シリーズで先駆けて開発されたサークルアンド検索機能は、長押しするだけで実現できる機能です。

GateToken(GT)通貨とは何ですか? GT コインの機能とトークンエコノミクスの紹介 GateToken(GT)通貨とは何ですか? GT コインの機能とトークンエコノミクスの紹介 Jul 15, 2024 pm 04:36 PM

GateToken(GT)通貨とは何ですか? GT (GateToken) は、GateChain チェーンのネイティブ資産であり、Gate.io の公式プラットフォーム通貨です。 GT コインの価値は、Gate.io および GateChain エコロジーの発展と密接に関連しています。ゲートチェーンとは何ですか? GateChain は 2018 年に誕生し、Gate.io によって開始された新世代の高性能パブリック チェーンです。 GateChain は、ユーザーのオンチェーン資産のセキュリティを保護し、便利な分散トランザクション サービスを提供することに重点を置いています。 GateChain の目標は、エンタープライズレベルの安全で効率的な分散型デジタル資産ストレージ、配信、およびトランザクションのエコシステムを構築することです。ゲートチェーンにはオリジナルがあります

ネオンアビスの8色武器紹介 ネオンアビスの8色武器紹介 Mar 31, 2024 pm 03:51 PM

ネオンアビスの8色目は武器の1つですが、8色目の武器の弾道や武器の強さの使い方を知りたいプレイヤーも多いと思います。それでは、Neon Abyss の 8 色の武器の軌道、武器の強さ、武器のゲームプレイに関する詳細なガイドを見てみましょう。ネオンアビスカラー8 詳細ガイド 武器紹介:魔法使いの秘密兵器!武器の攻撃速度: 普通 武器の強さ: 中程度 武器のゲームプレイ: 8 番目の色の攻撃方法は、3 回の単体攻撃とその後の光線の発射です。弾道表示:

オンラインスコアチェックプラットフォーム(便利で高速なスコア照会ツール)の紹介 オンラインスコアチェックプラットフォーム(便利で高速なスコア照会ツール)の紹介 Apr 30, 2024 pm 08:19 PM

高速スコア照会ツールは、生徒と保護者にとって利便性を高めます。インターネットの発展に伴い、ますます多くの教育機関や学校がオンライン スコア チェック サービスを提供し始めています。お子様の学業の進歩を簡単に追跡できるように、この記事では、一般的に使用されているオンラインスコアチェックプラットフォームをいくつか紹介します。 1. 利便性 - 保護者は、オンラインスコア確認プラットフォームを通じて、いつでもどこでも子供のテストスコアを確認できます。保護者は、コンピュータまたは携帯電話で対応するオンラインスコア確認プラットフォームにログインすることで、いつでも簡単に子供のテストスコアを確認できます。インターネットに接続できる環境であれば、仕事中でも外出中でも、保護者は子どもの学習状況を把握し、的を絞った指導や支援を行うことができます。 2. 複数の機能 - スコアのクエリに加えて、コースのスケジュールや試験の手配などの情報をオンラインで検索することもできます。

モバイル アプリと Jiaqin アプリの用途は何ですか? モバイル アプリと Jiaqin アプリの用途は何ですか? Mar 27, 2024 pm 09:01 PM

モバイル Hejiaqin APP は、家族管理、インテリジェント制御、家族コミュニケーションを統合する包括的なソフトウェアです。インテリジェントで便利な操作を通じて、ユーザーにとって快適でインテリジェントで調和のとれた家庭環境を構築することを目指しています。このアプリケーションを通じて、ユーザーは自宅のさまざまなスマートデバイスを簡単に制御および管理し、スマートライフがもたらす利便性を享受できます。では、モバイル アプリと Jiaqin アプリの具体的な機能は何ですか? 詳細を知りたいユーザーは、この記事に従って詳細を確認してください。 Mobile and Jiaqin アプリの使い方チュートリアル: Mobile and Jiaqin アプリの用途は何ですか? IT の知識がなくても、簡単にネットワークを管理できます。 3. 自宅から何千マイルも離れていても、家に帰って視聴できる 4. 豊富な機能で、スマートライフを楽しむ

See all articles