Mysql 索引的基础(下)_MySQL

May 30, 2016 pm 05:10 PM
ベース 索引

如果需要存储大量的URL并需要根据URL进行搜索查找。如果使用B-Tree 来存储URL,存储的内容就会很大,因为URL本身都很长。正常情况下会有如下查询:

 

SELECT id FROM url WHERE url="http://www.baidu.com";

 

若删除原来URL上的索引,而新增一个被索引的url_crc列,使用CRC32做hash ,就可以用下面的方式查询:

 

SELECT id FROM url WHERE url='http://www.baidu.com' AND rul_crc=CRC32('http://www.baidu.com');

 

这样做性能非常高,因为MySQL 优化器会使用这个选择性很高而体积很小的基于url_crc列的索引来完成查找。即使有多个相同的索引值,查找任然很快,只需要根据hash值做快速的整数比较就能找到索引条目,然后一一返回对应的行。另外一种方式就是对完整的URL字符串做索引,那样会非常慢。

 

这样实现的缺陷是需要维护hash值。可以手动维护,可以触发器实现。如果采用这种方式,记住,不要使用SHA1()和MD5()作为哈希函数。因为这两个函数计算出来的hash值时非常长的字符串,会浪费更大的空间,比较时也会更慢。SHA1()和MD5()是强加密函数,设计目标是最大限度的消除冲突,蛋这里并不需要这样搞的要求。简单hash函数的冲突在一个可以接受的范围,同事有能提供更好的性能。

 

如果数据表非常大,CRC32()会出现大量的hash冲突,则可以考虑自己实现一个简单的64位hash函数。这个自定义的函数要返回整数,而不是字符串。一个简单的办法可以使用MD5()函数返回值的一部分来作为自定义hash函数。这肯能比自己写一个hash算法的性能要差,不过这样实现最简单。

 

SELECT CONV(RIGHT(MD5('http://www.baidu.com'),16),16,10) AS HASH64.

 

处理hash冲突。当使用hash索引进行查询的时候,必须在WHERE子句中包含常量值:

 

SELECT id from url WHERE url=crc32('http://www.baidu.com') AND url='http://www.baidu.com';

 

一旦出现hash冲突,另一个字符串的hash值也恰好是相同的,则下面的语句是无法正确工作的:

 

SELECT id from url WHERE url=crc32('http://www.baidu.com');

 

因为所谓的‘生日悖论’ 出现hash冲突的概率的增长率可能比想象的要快的多,CRC32()返回的是32位整数,当索引有9.3W条记录时,出现冲突的概率是1%。例如,我们将'/usr/share/dic/words' 中的词倒数数据表,并进行crc32()计算,最后会有98569行。这就已经出现一次hash冲突了。要避免hash冲突问题,必须在WHERE 条件中带入hahs值和对应的列值。如果不是想查询具体的值,例如只是统计记录数(不精确的),则可以不带入列值,直接使用crc32()的hash值查询即可。还可以使用FNV64()函数作为hash函数,hash值为64位,速度非常快,且冲突比crc32()要少很多。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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)

Oracle のインデックス タイプとは何ですか? Oracle のインデックス タイプとは何ですか? Nov 16, 2023 am 09:59 AM

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

PHP 基礎チュートリアル: 初心者からマスターまで PHP 基礎チュートリアル: 初心者からマスターまで Jun 18, 2023 am 09:43 AM

PHP は、Web 開発のすべてのタスクを処理できる、広く使用されているオープン ソースのサーバー側スクリプト言語です。 PHP は Web 開発で広く使用されており、特に動的データ処理における優れたパフォーマンスのため、多くの開発者に愛され、使用されています。この記事では、初心者が入門から上級者になるまでをサポートするために、PHP の基本をステップごとに説明します。 1. 基本構文 PHP は、コードが HTML、CSS、および JavaScript に似ているインタープリター型言語です。すべての PHP ステートメントはセミコロンで終わります。

インデックスが配列の制限を超える問題の解決方法 インデックスが配列の制限を超える問題の解決方法 Nov 15, 2023 pm 05:22 PM

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

インデックスを使用して、PHP および MySQL でのデータのグループ化とデータ集約の効率を向上させるにはどうすればよいでしょうか? インデックスを使用して、PHP および MySQL でのデータのグループ化とデータ集約の効率を向上させるにはどうすればよいでしょうか? Oct 15, 2023 am 11:39 AM

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

Python のスライスとインデックス作成の高度なアプリケーション: 隠れた関数を明らかにし、プログラミングの無限の可能性を探求します。 Python のスライスとインデックス作成の高度なアプリケーション: 隠れた関数を明らかにし、プログラミングの無限の可能性を探求します。 Feb 19, 2024 pm 08:40 PM

Python でのスライスの基本構文は、スライス操作に [start:end:step] 構文を使用することです。ここで、start はスライスの開始位置を表し、end はスライスの終了位置を表し、step はスライス ステップを表します。 start が省略された場合、リストまたは文字列の先頭からスライスされることを意味します。end が省略された場合、リストまたは文字列の最後までスライスされることを意味します。step が省略された場合、ステップ サイズが 1 であることを意味します。例: my_list=[1,2,3,4,5]#2番目の要素から4番目の要素までをカット(4番目の要素を除く) sub_list=my_list[1:4]#[2,3,4 ]#Start最初の要素からリストの終わりまで sub_li

PHPは、別の文字列内の文字列の開始位置から終了位置までの文字列を返します。 PHPは、別の文字列内の文字列の開始位置から終了位置までの文字列を返します。 Mar 21, 2024 am 10:31 AM

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

配列の指定されたインデックス位置に複数の要素を挿入する Python プログラム 配列の指定されたインデックス位置に複数の要素を挿入する Python プログラム Sep 03, 2023 pm 10:13 PM

配列は、体系的に格納された同様のデータ要素のコレクションです。配列内の各データ要素はインデックス値によって識別されます。 Python の配列 Python にはネイティブの配列データ構造がありません。したがって、配列の代わりにリスト データ構造を使用できます。 [10,4,11,76,99] 同時に、PythonNumpy モジュールを使用して配列を処理できます。 numpy モジュールで定義された配列は -array([1,2,3,4]) です。Python でのインデックス付けは 0 から始まるため、上記の配列要素は 0、1、2、n までのようなそれぞれのインデックス値を使用してアクセスできます - 1.次の記事では、指定したインデックスに複数の要素を挿入するさまざまな方法を見ていきます。入って負ける

MySQL での一意のインデックスの使用に関するヒントと FAQ MySQL での一意のインデックスの使用に関するヒントと FAQ Mar 15, 2024 pm 03:09 PM

MySQL で一意のインデックスを使用するためのヒントと FAQ MySQL は一般的なリレーショナル データベース管理システムであり、実際のアプリケーションでは、一意のインデックス (uniqueindex) がデータ テーブルの設計で重要な役割を果たします。一意のインデックスを使用すると、テーブル内の特定の列の値が一意であることが保証され、データの重複を回避できます。この記事では、MySQL での一意のインデックスの使用スキルといくつかの一般的な質問への回答を紹介し、読者の理解を深めるために具体的なコード例を示します。 1.作成

See all articles