この記事は、golang チュートリアルコラム「Go rqlite作者が教えるデータベースソフト開発でアルゴリズムがいかに重要か!」について紹介したものです。 》, 困っている友達の役に立てば幸いです!
データベース プログラムを書くのは魅力的な仕事です。私は過去 2 年間、オープンソース データベースの開発に深く関わってきましたが、データベース プログラミングは、おそらくソフトウェア開発者として行うことができる最も刺激的なプロジェクトです。
しかし、本当に衝撃的なのは、データベースに対する私の態度が過去 6 年間でどれほど変わったかということです。最初は興味がなかったのですが、今ではデータベース システムがソフトウェア エンジニアリングの最高峰であると考えるようになりました。
何が良いのかわからない
私のキャリアのほとんどにおいて、データベースに関する唯一の経験はデータベースについて読んだことだけでした。通常は退屈な文脈で、データベースに関する学部の教科書を開けば、私の言いたいことがわかるでしょう。通常、リレーショナル データベースの典型的な使用例として、次の表が表示されます。
#ID | FIRST | LAST | TITLE | 部門 |
---|---|---|---|---|
1 | ロバート | ケリー | ディレクター | マーケティング |
2 | トム | バーク | 代表 | 営業 |
3 | ジョン | #スミス | 副社長 | セールス |
もっとつまらないものを読んでもいいですか?これらがすべてデータベースに関するものであれば、私はそれらとは一切関わりたくありません。ポイントは何ですか?ソフトウェアはこれよりもはるかに優れていますよね?そのため、私は長い間、データベースとの関わりを完全に避けてきました。
最初の CRUD アプリケーションを決して忘れることはありません
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 パフォーマンス、および使用されるレプリケーション。
パフォーマンスを制御する変数には終わりがありません。
クエリの場合、時系列データの時間範囲に依存する場合があります。これは、ヒットしたレコードの数、クエリされたフィールドの数、範囲スキャンが含まれるかどうか、データにインデックスが作成されているかどうか、使用されるインデックスの種類、アクセスできるシャードの数、およびデータがローカルかどうかによって異なります。そして機械の特性。在庫はありますか?メンテナンス中ですか?ネットワークが混雑していますか?
したがって、答えは常に、
です。データベース設計者は正直です。彼らは自分が構築したシステムについてすべてを知っていますが、あなたの質問に対する答えはまだ知りません。 プログラミング バケット リスト
プログラミング スキルを向上させたい開発者にアドバイスが 1 つあるとしたら、それはデータベース開発チームに参加することです。データベース開発のおかげで、私のプログラミング スキルは大幅に向上しました。素晴らしいコーディング体験でした。
元のアドレス: https://www.philipotoole.com/what-i-learned-from-programming-a-database/翻訳アドレス: https://learnku .com/go/t/64605
以上がGo rqlite の作者は、データベース ソフトウェアを開発する際にアルゴリズムがいかに重要であるかを語ります。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

GolangとCにはそれぞれパフォーマンス競争において独自の利点があります。1)Golangは、高い並行性と迅速な発展に適しており、2)Cはより高いパフォーマンスと微細な制御を提供します。選択は、プロジェクトの要件とチームテクノロジースタックに基づいている必要があります。

Golangは迅速な発展と同時プログラミングに適していますが、Cは極端なパフォーマンスと基礎となる制御を必要とするプロジェクトにより適しています。 1)Golangの並行性モデルは、GoroutineとChannelを介した同時性プログラミングを簡素化します。 2)Cのテンプレートプログラミングは、一般的なコードとパフォーマンスの最適化を提供します。 3)Golangのごみ収集は便利ですが、パフォーマンスに影響を与える可能性があります。 Cのメモリ管理は複雑ですが、コントロールは問題ありません。

speed、効率、およびシンプル性をspeedsped.1)speed:gocompilesquilesquicklyandrunseffictient、理想的なlargeprojects.2)効率:等系dribribraryreducesexexternaldedenciess、開発効果を高める3)シンプルさ:

Cは、ハードウェアリソースと高性能の最適化が必要なシナリオにより適していますが、Golangは迅速な開発と高い並行性処理が必要なシナリオにより適しています。 1.Cの利点は、ハードウェア特性と高い最適化機能に近いものにあります。これは、ゲーム開発などの高性能ニーズに適しています。 2.Golangの利点は、その簡潔な構文と自然な並行性サポートにあり、これは高い並行性サービス開発に適しています。

Golangは実際のアプリケーションに優れており、そのシンプルさ、効率性、並行性で知られています。 1)同時プログラミングはゴルチンとチャネルを通じて実装されます。2)柔軟なコードは、インターフェイスと多型を使用して記述されます。3)ネット/HTTPパッケージを使用したネットワークプログラミングを簡素化、4)効率的な同時クローラーを構築する、5)ツールと最高の実践を通じてデバッグと最適化。

GOのコア機能には、ガベージコレクション、静的リンク、並行性サポートが含まれます。 1. GO言語の並行性モデルは、GoroutineとChannelを通じて効率的な同時プログラミングを実現します。 2.インターフェイスと多型は、インターフェイスメソッドを介して実装されているため、異なるタイプを統一された方法で処理できます。 3.基本的な使用法は、関数定義と呼び出しの効率を示しています。 4。高度な使用法では、スライスは動的なサイズ変更の強力な機能を提供します。 5.人種条件などの一般的なエラーは、Getest Raceを通じて検出および解決できます。 6.パフォーマンス最適化Sync.Poolを通じてオブジェクトを再利用して、ゴミ収集圧力を軽減します。

GO言語は、効率的でスケーラブルなシステムの構築においてうまく機能します。その利点には次のものがあります。1。高性能:マシンコードにコンパイルされ、速度速度が速い。 2。同時プログラミング:ゴルチンとチャネルを介してマルチタスクを簡素化します。 3。シンプルさ:簡潔な構文、学習コストとメンテナンスコストの削減。 4。クロスプラットフォーム:クロスプラットフォームのコンパイル、簡単な展開をサポートします。

SQLクエリの結果の並べ替えについて混乱しています。 SQLを学習する過程で、しばしば混乱する問題に遭遇します。最近、著者は「Mick-SQL Basics」を読んでいます...


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

WebStorm Mac版
便利なJavaScript開発ツール

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

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

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター
