この記事は、golang チュートリアルコラム「Go rqlite作者が教えるデータベースソフト開発でアルゴリズムがいかに重要か!」について紹介したものです。 》, 困っている友達の役に立てば幸いです!
データベース プログラムを書くのは魅力的な仕事です。私は過去 2 年間、オープンソース データベースの開発に深く関わってきましたが、データベース プログラミングは、おそらくソフトウェア開発者として行うことができる最も刺激的なプロジェクトです。
しかし、本当に衝撃的なのは、データベースに対する私の態度が過去 6 年間でどれほど変わったかということです。最初は興味がなかったのですが、今ではデータベース システムがソフトウェア エンジニアリングの最高峰であると考えるようになりました。
私のキャリアのほとんどにおいて、データベースに関する唯一の経験はデータベースについて読んだことだけでした。通常は退屈な文脈で、データベースに関する学部の教科書を開けば、私の言いたいことがわかるでしょう。通常、リレーショナル データベースの典型的な使用例として、次の表が表示されます。
#ID | FIRST | LAST | TITLE | 部門 |
---|---|---|---|---|
1 | ロバート | ケリー | ディレクター | マーケティング |
2 | トム | バーク | 代表 | 営業 |
3 | ジョン | #スミス | 副社長 | セールス |
もっとつまらないものを読んでもいいですか?これらがすべてデータベースに関するものであれば、私はそれらとは一切関わりたくありません。ポイントは何ですか?ソフトウェアはこれよりもはるかに優れていますよね?そのため、私は長い間、データベースとの関わりを完全に避けてきました。
2009 年、組み込みソフトウェア、Linux デバイス ドライバー、およびネットワーク ソフトウェアを何年も書いた後、気がつくと、Web ベースのシステムを構築する必要があるチームを率いていました。ご存知のとおり、AWS クラウドが登場し、クラウドベースのライセンス テクノロジーの MAC アドレスは無効になりました。私のチームは、新しい EC2 ベースのソフトウェア アプライアンス用のライセンス ポータルを構築する必要があります。私たちは Python の経験が豊富だったので、MySQL 上で実行される Django を選択しました。実際にデータベースに取り組み始めました。
CRUD アプリケーションが我が国の平原で実行され続けるにつれて、データベースがいかに重要であるか、そしてそれがシステムの中心であることに気づき始めました。データベースを失ってしまったら、ソフトウェア開発は無駄になってしまいます。データベースのデータが破損すると、お客様のデバイスのライセンスが失われ、ネットワークが機能しなくなる可能性があります。データベースが適切に機能しない場合、数千人が同時に影響を受けることになります。しかし、これらのことは何も起こりませんでした。データベース常に動作します。それは私たちを決して失望させません。私が感銘を受けた。
その後、外部キー制約、一意制約、参照整合性、インデックスなどを発見しました (覚えておいてください、現時点ではこれらのことについては何も知りません)。データベースは、より堅牢なシステムを構築するためのさまざまな方法で役立ちます。最近のデータベースは 素晴らしい - データベースは世界で最も退屈なものです 実際にシステムを構築する必要があるまでは
2012 年までに、私は大規模なインデックス作成および検索システムに基づいて、elasticsearch を使用した大規模なキーと値のデータベースを構築するチームを率いていました。芯。 Elasticsearch のようなシステム (世界クラスのインデックス作成に基づいて構築されたテクノロジ) が、たとえテラバイト規模のログ データであっても何ができるかを見るのは目を見張るものがあります。
これまで、データベースや検索システムでさえ失敗するのを見てきましたが、私はデータベース テクノロジーに魅了されています。 2014 年までに、私は [オープンソース時系列データベース] (github.com/influxdata/influxdb) のコアを開発する小規模な専任チームに加わりました。
Big O 分析が実際に活きるのは、データベース開発においてのみです。データベースは、プログラマーが数百万ものオブジェクトをループ、並べ替え、フィルター処理する必要がある数少ないアプリケーションの 1 つです。ここは、CS クラスで学んだ退屈な内容が重要視される数少ない場所の 1 つです。
これは、他の多くのソフトウェア開発には当てはまりません。ブートROMファームウェアを書き込んでいますか?いいえ、私にとってアルゴリズムは決して重要ではありませんでした。チューナーのデバイスドライバー? いいえ、それは問題ではありません。ネットワークデバイス管理ソフトウェア?CRUDアプリケーション?これらの分野のすべてが異なるスキルや知識を必要とすることはほとんどありません。ほとんどの場合、私はインタビューでランタイムの複雑さについて話しただけでした。
しかし、データベースの発展により、この状況はすべて変わりました。システムが正しい結果を返すのを実際に見るのは素晴らしいことですが、それはアルゴリズムの変更によるほんの一部の時間だけであり、それが自分のコードや構築したシステムで起こるのを見ることは素晴らしいことです。
ソフトウェアに関する古い話に次のようなものがあります。プログラマーは、以前のバージョンより 10 倍速く実行されるコードを作成しました。それを見せたのですが、出てきたデータが正しいデータと少し違うと誰かが指摘しました。 「しかし、それは 10 倍高速です」とプログラマーは指摘しました。 「そうですね、正確である必要がないのであれば、まったくスペースを取らず、無限に高速に実行できるバージョンを作成できます」と別のユーザーが答えました。
この道徳の話は常に私に大きな影響を与えてきました。正しいことは常に他の何よりも重要です。これは本物です。しかし、それはまた、プロジェクトが正しい結果を生み出すという理由だけでプロジェクトに価値があると私に信じさせるものでもあります。
データベースの場合、これは当てはまりません。
パフォーマンスは単なる機能ではありません。これは要件です。データベースに喜んでお金を払う人は、多くの場合、大量のデータを所有しているためにそうします。この状況でデータベースのパフォーマンスが良くない場合、つまり結果が迅速かつ効率的に返されない場合、データベースはまったく機能しない可能性があります。
データベース開発に関して私が最もショックを受けたのは、クエリ エンジンがいかに複雑になったかだと思います。私は、データをディスクに書き込んで保存するシステムを構築した経験が豊富です。これらのシステムを適切に機能させることは、大きな課題となる可能性があります。
しかし、この複雑さは通常、クエリ エンジンの複雑さよりもはるかに小さいです。柔軟なクエリ システム (質問が何になるかわからない場合に質問に答えるシステムを効果的に構築する) には、真剣な設計思考が必要です。クエリ プランナーは有効である必要があります。クエリ システムは、特定のディメンションによるフィルタリング、他のディメンションによるグループ化、異なるテーブルからのデータの結合など、多くの直交要件をサポートする必要があり、場合によっては外部ソースからのデータもサポートする必要があります。最後に、クエリ システム は効率的であり、良好なパフォーマンスを発揮する必要があります。これにより、設計と実装における抽象化と最適化の間に緊張が生じ、これを適切に管理するには真のスキルが必要になります。
真面目なオペレーターである私がデータベースをバックアップできない場合、単純なことですが、データベースを使用することはできません。データベースが書き込みを受け入れる速度は関係ありません。クエリ中は、メモリ フットプリントがどれほど小さいかは関係ありません。データベースの作成者であるあなたの制御を超えた障害からデータベース内のデータを保護できなければ、データベースを快適に実行することはできません。
もちろん、データベースの協力を必要とせずにデータベースをバックアップする方法はたくさんあります。ただし、通常は組み込みメソッドが最適です。これは、rqlite v2.0 に対する私の推奨事項でもありますが、誰かに rqlite を真剣に使ってもらいたいのであれば、システムが完全に障害を起こし、データに長時間遅れてしまう可能性がある現実の問題を解決する必要があります。
データベース プログラマーに相談して、次のような質問をしてみてはいかがでしょうか。そして、あなたがしばしば、おそらくはこれからも得られる答えは次のとおりです。
それはあなた次第です。ベンチマークを行い、測定する必要があります。これを聞くとイライラするかもしれませんし、責任を回避しているように見えるかもしれません。 しかし、それは真実ではありません。
インデックス作成率は、ドキュメントやデータ ポイントの数だけでなく、データのサイズにも依存する場合があります。これは、バッチ処理、データのカーディナリティ、データベースがクラスタ化されているかどうか、データ内のどの列とフィールドにインデックスが付けられているか、新しいデータか既存データの更新か、データベースが実行されているマシンによって異なります。 RAM、IO パフォーマンス、および使用されるレプリケーション。
パフォーマンスを制御する変数には終わりがありません。
クエリの場合、時系列データの時間範囲に依存する場合があります。これは、ヒットしたレコードの数、クエリされたフィールドの数、範囲スキャンが含まれるかどうか、データにインデックスが作成されているかどうか、使用されるインデックスの種類、アクセスできるシャードの数、およびデータがローカルかどうかによって異なります。そして機械の特性。在庫はありますか?メンテナンス中ですか?ネットワークが混雑していますか?
したがって、答えは常に、
です。データベース設計者は正直です。彼らは自分が構築したシステムについてすべてを知っていますが、あなたの質問に対する答えはまだ知りません。 プログラミング バケット リスト
翻訳アドレス: https://learnku .com/go/t/64605
以上がGo rqlite の作者は、データベース ソフトウェアを開発する際にアルゴリズムがいかに重要であるかを語ります。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。