<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: CYN</title>
    <description>The latest articles on DEV Community by CYN (@yuxi903).</description>
    <link>https://dev.to/yuxi903</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F857011%2F3a357ab3-3012-422c-9ff6-1cebcbee4673.png</url>
      <title>DEV Community: CYN</title>
      <link>https://dev.to/yuxi903</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yuxi903"/>
    <language>en</language>
    <item>
      <title>Long Live MySQL: Kudos to the Ecosystem Innovators</title>
      <dc:creator>CYN</dc:creator>
      <pubDate>Sun, 15 May 2022 09:20:48 +0000</pubDate>
      <link>https://dev.to/yuxi903/long-live-mysql-kudos-to-the-ecosystem-innovators-1nah</link>
      <guid>https://dev.to/yuxi903/long-live-mysql-kudos-to-the-ecosystem-innovators-1nah</guid>
      <description>&lt;p&gt;&lt;strong&gt;Author:&lt;/strong&gt; &lt;a href="https://github.com/c4pt0r"&gt;Ed Huang&lt;/a&gt; (Co-Founder &amp;amp; CTO at PingCAP)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post is the second part in our series. You can find the first part here:&lt;/em&gt; &lt;em&gt;**&lt;a href="https://en.pingcap.com/blog/long-live-mysql-good-old-mysql-should-be-rejuvenated/"&gt;Long Live MySQL: Good Old MySQL Should Be Rejuvenated&lt;/a&gt;*&lt;/em&gt;*.&lt;/p&gt;

&lt;p&gt;I am a firm believer in MySQL and its ecosystem. As I said in &lt;a href="https://en.pingcap.com/blog/long-live-mysql-good-old-mysql-should-be-rejuvenated/"&gt;my previous article&lt;/a&gt;, the MySQL ecosystem is still thriving with a lot of innovations in the space, and MySQL applications and developers are still one of the mainstays of the database market. &lt;strong&gt;The question is: do we need a more modernized MySQL? Absolutely yes.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;In this article, I’ll illustrate the robustness and progressiveness of MySQL by sharing some of the key players in the more modern MySQL ecosystem. &lt;/p&gt;

&lt;h2&gt;
  
  
  Forks of MySQL: MariaDB and Percona as examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  MARIADB
&lt;/h3&gt;

&lt;p&gt;There is no talking about MySQL alternatives without mentioning MariaDB, an enterprise MySQL fork driven by the open source community. Open source factors aside, MariaDB has a lot to offer both as a technology and a product.&lt;/p&gt;

&lt;p&gt;To cope with increasing data volume, MariaDB provides MaxScale, a simple proxy-like component that supports query routing, read-write separation, and automatic failover based on the MySQL Binlog. Scaling with MaxScale is more about sharding data vertically than horizontally. If a user’s application works with large tables, the horizontal sharding workload must be completed in the application layer, which is intrusive to the application.&lt;/p&gt;

&lt;p&gt;As the boundaries blur between real-time analytics and online transactions in modern workloads, MariaDB introduced ColumnStore to speed up queries for Online Analytical Processing (OLAP). ColumnStore supports direct reads and writes and was introduced as a MySQL new storage engine. However, currently there isn’t a way for ColumnStore tables to be interconverted with those of InnoDB, MySQL’s default storage engine. The way I see it, the performance of column storage for writing is different from that of row storage in terms of both throughput and latency. Users need to know clearly which workloads are suitable for running on ColumnStore. To achieve a Hybrid Transactional and Analytical Processing (HTAP) experience, ColumnStore must be used with MaxScale to route Online Transactional Processing (OLTP) and OLAP requests to the corresponding table or database at the MaxScale layer. When users design their schema, they must take these requirements into account. Many next generation database companies, not just MariaDB, are noticing this trend to process both OLTP and OLAP workloads.&lt;/p&gt;

&lt;h3&gt;
  
  
  PERCONA
&lt;/h3&gt;

&lt;p&gt;Percona is a key long-term supporter of the MySQL ecosystem and a recognized expert in MySQL operation and maintenance. They have contributed many well-received tools to the MySQL community, such as pt-online-schema-change and pt-query-digest. Percona’s business model is to package these tools with MySQL, introduce other practical functions based on the MySQL kernel, and release it as a community distribution with commercial support. &lt;/p&gt;

&lt;p&gt;The differences between Percona Server for MySQL and MySQL is easy to find on Percona’s official website. Here I will highlight two points that I think are interesting: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MyRocks.&lt;/strong&gt; MyRocks is a MySQL storage engine based on RocksDB, an embeddable, persistent key-value store. Percona MyRocks implements Percona Server for MySQL. RocksDB is a log structured merge (LSM) tree implementation. Compared to B-tree, LSM tree has a data structure that caters more to modern hardware, has a better compression ratio, and is easier to implement. In addition, LSM-Tree is built with the idea of tiered storage. If you want to implement a cloud-native storage engine and make full use of different storage media on the cloud, tiered storage is an ideal design. MyRocks would be a great addition to MySQL for modern hardware and cloud infrastructure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;XtraDB Cluster.&lt;/strong&gt; Percona integrates ProxySQL as a routing layer and then uses Galera to achieve high availability of storage nodes in a distributed architecture. However, like MariaDB, the most suitable scenarios for XtraDB Cluster are the vertical sharding of tables and databases, read-write separation, and node-level auto-failover. XtraDB Cluster is not a distributed database that supports horizontal scaling.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Percona has supported the ClickHouse community for quite a while. In some ways, this support makes up for the real-time analytical capabilities of MySQL. As businesses become more real-time in the digital transformation era, the mass MySQL user groups hope that the MySQL ecosystem can provide real-time analytics capabilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Middleware on top of MySQL: Vitess as an example
&lt;/h2&gt;

&lt;p&gt;When faced with the challenge of massive data, MariaDB and Percona Server choose vertical sharding and read-write separation through proxy. For large single tables, however, horizontal sharding is a better option with less intrusion on the application. The application only needs to specify the sharding key, and then a routing layer decides which shard it should store. The routing layer is transparent to the application. One example of this proxy design is Vitess, a SQL middleware which turns MySQL into a fast, scalable, and highly-available distributed database. Vitess was open-sourced after being widely used at YouTube and has become the mainstream solution for MySQL sharding. However, its limitations are also obvious. For example, a sharding proxy is not a database, but a routing layer for requests. This means that Vitess does not support complex queries, which is a tricky issue for distributed transactions across shards. The failover and service levels heavily rely on the underlying MySQL mechanisms. Of course, the existing MySQL operation and maintenance experience can still be leveraged.&lt;/p&gt;

&lt;h2&gt;
  
  
  Initial HTAP practitioners: SingleStore as an example
&lt;/h2&gt;

&lt;p&gt;The predecessor of SingleStore is MemSQL. Its early positioning was as a distributed OLAP database that supports massively parallel processing (MPP), with an all-in-memory design. Later, this solution added disk storage support and was renamed SingleStore. SingleStore supports a row-based storage format for OLTP workloads. However, the default storage engine is ColumnStore, which indicates that it focuses more on &lt;em&gt;OLAP&lt;/em&gt; workloads. Because SingleStore can handle both workloads in the same database, it can be classified as an HTAP database. Since then, many databases in the MySQL ecosystem have enhanced their OLAP capabilities.&lt;/p&gt;

&lt;p&gt;There are two types of nodes in the SingleStore architecture: aggregator nodes and leaf nodes. The leaf node stores table data shards. Some SQL operators are pushed down to the leaf node to accelerate computing. SingleStore is also one of the few OLAP databases that follow codegen technology routes, in which execution plans are compiled into machine code and cached locally for reuse. Other OLAP databases, such as ClickHouse and MonetDB, adopt vectorization to develop faster analytical query engines by making efficient utilization of CPU cache.&lt;/p&gt;

&lt;p&gt;Because SingleStore is compatible with the MySQL protocol, it is easier to adopt and more cost effective. Overall, I think it has a good market and growth strategy.&lt;/p&gt;

&lt;h2&gt;
  
  
  RDS on public cloud: Amazon Aurora as an example
&lt;/h2&gt;

&lt;p&gt;Amazon Aurora is a significant database innovation. Aurora does not use a shared-nothing architecture like Spanner. Instead, it is optimized based on a stand-alone RDBMS. Aurora keenly seized the following characteristics of long-tail users on the cloud:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;High expectations for elasticity and relatively low requirements for scalable storage capacity &lt;/li&gt;
&lt;li&gt;Higher scalability requirements for data reads than writes &lt;/li&gt;
&lt;li&gt;Mostly RDBMS users because it’s 100% compatible with MySQL &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aurora also leverages the capabilities of cloud infrastructure in a smart way: the throughput of shared storage is basically the same as that of local disks. Shared storage for a database means that the computing node can become stateless, thereby realizing the separation of computing and storage. This is possible because computing and storage have different hardware requirements. For example, to scale the read requests, Aurora simply adds a new computing node of the read replica. The process does not involve much data migration effort except for the cache warm-up time. This is also a key prerequisite for serverless implementation. &lt;/p&gt;

&lt;p&gt;In addition, Aurora’s shared storage does not mean just running InnoDB on a distributed file system. It represents the design concept of “The log is database.” In fact, as long as the Redo log is secured, the data is secured. The storage uses Redo log records to build the page image on demand. Compared with traditional Binlog replication, this method has reduced log serialization, network transmission load, and the write amplification caused by applying the binlog. This significantly improves the write performance when compared with a standalone database. As a cloud provider, AWS offers a complete cloud hosting service for Aurora.&lt;/p&gt;

&lt;p&gt;The problem with Aurora is that it is essentially a standalone database. Even with its modern design, if Aurora is faced with large data volume or write scalability issues, it may still need to be supplemented by sharding middleware like Vitess or distributed SQL databases like TiDB. Additionally, Aurora supports parallel scanning for some types of computation on the read replica, but its main focus still seems to be on traditional OLTP workloads. &lt;/p&gt;

&lt;h2&gt;
  
  
  Next-Gen distributed SQL: TiDB as an example
&lt;/h2&gt;

&lt;p&gt;TiDB is one of the next-gen distributed SQL databases that has been active in recent years. It was initially inspired by Google Spanner and F1. Currently, there are several distributed SQL projects that are active in the community: CockroachDB (CRDB), YugabytesDB, and TiDB. CRDB and YugabytesDB are PostgreSQL compatible; however, of the three, TiDB is the only one that is MySQL compatible.&lt;/p&gt;

&lt;p&gt;TiDB is not an altered fork of the MySQL code. Instead, it was developed from scratch with a more modern design. TiDB adopts a typical shared-nothing design, which ensures its elastic scalability. The TiDB architecture has two layers: the top is the stateless SQL layer responsible for connection management, SQL parsing and optimization, and distributed execution plan generation. The bottom layer is TIKV, a distributed key-value storage layer. TiKV supports ACID transactions, and it stores the data. The SQL layer converts data in relational models such as tables, rows, and indexes into key-value pairs and stores them in TiKV. The advantage of this design is that it is easier to achieve elastic distribution in a key-value model than in a relational model. This is because in the relational model, there are too many concepts: there are tables, there are databases, there are many columns in a row, and that means there are countless kinds of sharding strategies. However, for the key-value model, it is obvious to follow the range of key (or hash of keys). I described the details in the blog post, &lt;a href="https://tikv.org/blog/building-distributed-storage-system-on-raft/?__hstc=86493575.5ac62f3049a9d711dd670a321f534c8a.1633933890397.1652408155686.1652606106767.65&amp;amp;__hssc=86493575.1.1652606106767&amp;amp;__hsfp=492095090"&gt;Building a Large-scale Distributed Storage System Based on Raft&lt;/a&gt;. TiDB adopts Raft, a modern consensus algorithm, to achieve high availability and horizontal scalability on a distributed architecture. In addition, since the SQL layer is stateless with no storage dependency, it is convenient to scale the connection layer and the computing layer independent of each other. &lt;/p&gt;

&lt;p&gt;Unlike SingleStore, TiDB’s positioning in the early days was as more of an OLTP database, which was designed to handle high-frequency transactions with low-latency and high-concurrency. When MySQL users are faced with scalability challenges, if they are up for sharding and are looking for a simpler, less intrusive distributed database that supports elastic scaling, TiDB could be a good option.&lt;/p&gt;

&lt;p&gt;In the past two years, while the boundaries between OLTP and OLAP are blurring, more users sought a simpler database. Building on the existing distributed framework, we implemented TiFlash, a distributed columnar storage engine to make TiDB a true HTAP database. Thanks to TiDB’s decoupled design, the SQL computing layer forwards the OLAP request to the columnar replica on TiFlash. Users do not need to care about the synchronization of data replicas between the column storage and the row storage, and OLTP and OLAP workloads are resolved within the same architecture. I will not explain the technical details here, but if you’d like more information on TiFlash’s design, see the TiDB team’s paper, &lt;a href="https://www.vldb.org/pvldb/vol13/p3072-huang.pdf"&gt;TiDB: A Raft-based HTAP Database&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It is not easy for users to maintain a complex distributed system in a production environment, and it is even more complicated with the various tools built into modern databases. As mentioned earlier, more users are moving to the cloud, where managed services can shield these complexities. TiDB’s fully managed service is also available on AWS and CCP, which makes an important difference.&lt;/p&gt;

&lt;p&gt;However, there is a lot of legacy code in MySQL, after all it’s been around for more than 20 years and was mostly designed around MyISAM, a non-transactional storage engine. Some of that idiosyncrasy doesn’t transfer well into a fully distributed database architecture. To fully take advantage of the capabilities of the distributed architecture, TiDB’s SQL optimizer and executor are designed as a distributed environment computing engine. Therefore, some behaviors may be different from that in stand-alone MySQL.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;MySQL users now have a greater choice with more scalable, innovative distributed architectures. There is no shortage of innovation in the MySQL ecosystem, and some of these projects are even leading the database industry in terms of technical progress. These are exciting times and the future is bright.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Long live MySQL.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This post is the second part in our series. You can find the first part here: *&lt;/em&gt;&lt;a href="https://en.pingcap.com/blog/long-live-mysql-good-old-mysql-should-be-rejuvenated/"&gt;Long Live MySQL: Good Old&lt;/a&gt;***&lt;em&gt;**&lt;a href="https://en.pingcap.com/blog/long-live-mysql-good-old-mysql-should-be-rejuvenated/"&gt; MySQL Should Be Rejuvenated&lt;/a&gt;*&lt;/em&gt;*.&lt;/p&gt;

</description>
      <category>mysql</category>
      <category>database</category>
    </item>
    <item>
      <title>Long Live MySQL: Good Old MySQL Should Be Rejuvenated</title>
      <dc:creator>CYN</dc:creator>
      <pubDate>Fri, 13 May 2022 01:25:34 +0000</pubDate>
      <link>https://dev.to/yuxi903/long-live-mysql-good-old-mysql-should-be-rejuvenated-4nd9</link>
      <guid>https://dev.to/yuxi903/long-live-mysql-good-old-mysql-should-be-rejuvenated-4nd9</guid>
      <description>&lt;p&gt;&lt;strong&gt;Author:&lt;/strong&gt; &lt;a href="https://github.com/c4pt0r"&gt;Ed Huang&lt;/a&gt; (Co-Founder &amp;amp; CTO at PingCAP)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post is the first part in our series. You can see the second part **here&lt;/em&gt;&lt;em&gt;: *&lt;/em&gt;&lt;a href="https://en.pingcap.com/blog/long-live-mysql-kudos-to-the-ecosystem-innovators/"&gt;Long Live MySQL: Kudos to the Ecosystem Innovators&lt;/a&gt;***.&lt;/p&gt;

&lt;p&gt;Imagine you’re an application developer, and your manager tells you to prototype a new application in a week. What would you choose for your database? Probably MySQL.&lt;/p&gt;

&lt;h2&gt;
  
  
  MySQL is ubiquitous
&lt;/h2&gt;

&lt;p&gt;Many engineers love MySQL. DB-Engines reports MySQL is &lt;a href="https://db-engines.com/en/ranking"&gt;the second most popular database&lt;/a&gt;; however, some other databases, such as SQLite and IBM Db2, are decreasing in popularity. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jRpQE_Da--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h26imugvcij20qw0apt9n.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jRpQE_Da--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h26imugvcij20qw0apt9n.jpg" alt="img" width="880" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://db-engines.com/en/ranking"&gt;&lt;em&gt;Database popularity ranking according to DB-Engines&lt;/em&gt; &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From the 73,317 responses of &lt;a href="https://insights.stackoverflow.com/survey/2021#most-popular-technologies-database"&gt;Stack Overflow’s 2021 Developer Survey&lt;/a&gt;, MySQL ranked as the most popular database.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2Yv0Ts-I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h26imrm2ctj217l0es0ww.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2Yv0Ts-I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h26imrm2ctj217l0es0ww.jpg" alt="img" width="880" height="298"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://insights.stackoverflow.com/survey/2021#most-popular-technologies-database"&gt;&lt;em&gt;Database popularity ranking according to Stack Overflow’s 2021 Developer Survey&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MySQL is also popular when it comes to hiring. I searched for jobs on &lt;a href="http://www.indeed.com/"&gt;Indeed&lt;/a&gt; with the keywords of top used databases, and there were 31,245 jobs returned for “mysql.” Job openings that require a “mysql” skillset are the second highest among the top databases.&lt;/p&gt;

&lt;p&gt;MySQL is ubiquitous. In fact, at PingCAP, MySQL was one of the few databases a lot of our engineers knew how to use before they joined PingCAP. I was one of them. &lt;/p&gt;

&lt;h2&gt;
  
  
  My 20 years with MySQL
&lt;/h2&gt;

&lt;p&gt;I used MySQL for the first time when I was a high school student in 2003. Back then, I wanted to develop a web application (Online Judge) with PHP for programming competition hobbyists and help them run their code and check whether it was correct. To store the data users submitted, I needed a database. MySQL was my best choice because it was so straightforward and user friendly. I could use MySQL client to write SQL and operate the database in PHP directly and then Apache rendered the dynamic page results. &lt;/p&gt;

&lt;p&gt;In 2012, I joined a startup company whose infrastructure was based on MySQL. I was one of the few infrastructure engineers. The company business grew so fast, its data volume soon spiked beyond MySQL’s single-machine capacity. So I began to seek solutions. For example, I used MySQL binlog for highly available primary and secondary layers and applied horizontal sharding. When I left that company, its database cluster had more than 30 shards which could hold dozens of terabytes. For me, solving these issues was a very fulfilling experience. &lt;/p&gt;

&lt;p&gt;Because of these MySQL-related experiences, I had the opportunity to meet many excellent engineers who had similar memories working with MySQL. In 2015, when I decided to start my own business and build a brand new database, MySQL was the first ecosystem that popped into my mind. &lt;/p&gt;

&lt;h2&gt;
  
  
  Why so many people love MySQL
&lt;/h2&gt;

&lt;p&gt;MySQL’s popularity is unquestionable, although its earlier versions were not as advanced as what we see today. The secret sauce behind its popularity is that MySQL is simple and easy to use. Many user-friendly features like Binlog were introduced to MySQL early as well. As a result, the number of MySQL users grew dramatically in the following three decades. In addition, many users gave their feedback on using MySQL or contributed to MySQL directly, all of which led to a more prosperous MySQL ecosystem. In its heyday, MySQL became a natural choice for many businesses because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Many engineers are using it, making a large talent pool available for database companies. &lt;/li&gt;
&lt;li&gt;It is open-sourced, making it easy to obtain and use. &lt;/li&gt;
&lt;li&gt;You could find the answers to almost any MySQL question on the internet. &lt;/li&gt;
&lt;li&gt;It has a vibrant ecosystem. A large number of open source projects, such as WordPress and phpMyAdmin, heavily relied on MySQL and made it even more prevalent. &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Things have changed
&lt;/h2&gt;

&lt;p&gt;During the past 20 years, the world has been changing rapidly and we have witnessed many significant changes in technology such as the explosion of the mobile internet and today’s digital transformation. Our application scenarios have changed enormously as well. What are these changes? Let’s explore them from a data perspective. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data volume increased exponentially, making distributed technology a must for almost all modern databases.&lt;/strong&gt; NoSQL databases do a very good job of building a distributed architecture. They provide transparent scalability while maintaining consistent usage, so that developers can scale in and out without worrying about application change. However, NoSQL databases provide users with an even more limited set of functions than SQL databases. This was not a big problem in the early days of Web 2.0 because although data volume increased, business models were relatively simple. Take Twitter for example: in its earliest versions, it provided nothing more than a giant shared note service within a limit of 140 characters. &lt;/p&gt;

&lt;p&gt;If enterprises plan to build complicated applications, especially those that require strong consistency and complex association analysis such as JOIN and GROUP BY, SQL is still their best option. Unfortunately, traditional relational databases including MySQL and PostgreSQL made few innovations for a long time even though they embraced distributed technology. They developed their databases for a single machine, making sharding the only mainstream solution to deal with distributed requirements. Recently, however, we have seen some new database projects that can be called real distributed SQL databases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;At first, data models evolved from complicated to simple, and then became even more complicated.&lt;/strong&gt; This evolution comes with the significant change in technology like the mobile internet explosion. The then-prevalence of NoSQL and sharded databases made data modeling subject to a limited set of functions. For a while, data application modeling had to be simplified to key-value pairs, documents, and other flexible and simple models. &lt;/p&gt;

&lt;p&gt;However, when the low-hanging fruit is picked, the really hard problems get trickier. As more industries such as financial services and e-commerce begin their digital transformation to accelerate their online business, the databases’ application scenarios are becoming more complicated. So, the relational model plus SQL is almost always our best database solution. In the last 10 years, we have seen many attempts to model data with new domain-specific languages (DSL)—GraphQL is one example—but I think none of them can shake the dominant place of a relational model plus SQL combination. Google described this situation succinctly in its research paper “&lt;a href="https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/41344.pdf"&gt;&lt;em&gt;F1: A Distributed SQL Database That Scales&lt;/em&gt;&lt;/a&gt;”: &lt;/p&gt;

&lt;blockquote&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"When we sought a replacement for Google’s MySQL data store for the AdWords product, that option was simply not feasible: the complexity of dealing with a non-ACID data store in every part of our business logic would be too great, and there was simply no way our business could function without SQL queries."
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;The demand has been increasing for stronger consistency and real-time transactional processing and analytics.&lt;/strong&gt; In the early days, MySQL’s default storage engine was MyISAM, but eventually InnoDB took its place. I think one of the main differences is that InnoDB supports strongly consistent transactions. The more consistent semantics the database layer provides, the less complexity the application layer has to bear. This is especially true when you are dealing with failovers. If the database does not support strong consistency, it is difficult to guarantee data integrity when performing a disaster recovery. This is not acceptable in most financial scenarios.&lt;/p&gt;

&lt;p&gt;In the last decade, there have been many innovations in database management technologies. However, one obvious trade off is the separation of Online Transactional Processing (OLTP) and Online Analytical Processing (OLAP). Streaming technologies such as Apache Kafka, Apache Storm, and Apache Spark have emerged to form the so-called “lambda architecture,” which combines the two systems and eliminates the latency of extract, transform, load (ETL). While this approach works in many situations, the architectural complexity introduced has been a tough nut to crack. It is also difficult to keep the data consistent on this head-scratching technology stack. This has caused great challenges for many businesses that require real-time insights at the minute or even millisecond level. Due to the technical barriers, companies might have to suppress their business needs and turn to solutions that are more traditional but easier to tame. As data volume and the demand of real-time analytics have risen in recent years, OLTP and OLAP are on the track of integration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The way data is generated and consumed is becoming multifaceted.&lt;/strong&gt; In the past, writing to a database was simple: the client connected directly to the DB through SQL statements. If you take a closer look at how data enters the DB today, you can see that the upstream is much more diversified; it could be a message queue or batch writing from an ETL job. The challenge for batch writing is that users normally care more about the throughput performance than whether the ACID isolation requirements are met. In such scenarios, traditional transaction mechanisms such as locking would be unnecessary. On the other hand, the dramatic rise in real-time requirements lead to the need for data change synchronization to a downstream message queue for consumption. Change Data Capture (CDC) has become a mainstream implementation for modern databases. For example, MySQL has Binlog, Oracle has GoldenGate, and PG has pg replication.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data quality is increasingly required and the scope of observability extends from the execution panel to the data panel.&lt;/strong&gt; Twenty years ago, most of our focus was on simple database system metrics such as queries per second (QPS), transactions per second (TPS), latency, and query plan level. With the dramatic increase in data volume and the emergence of distributed databases, we are not satisfied with basic system information; we want to observe how data is accessed, and from that, gain business insights. Take TiDB’s KeyVisualizer as an example. It reflects the distribution of data access in real time so that you can tell at a glance which data is frequently accessed and what are the characteristics of the access.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yZMwMTqM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h26imtg8plj20dc09udgb.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yZMwMTqM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h26imtg8plj20dc09udgb.jpg" alt="img" width="480" height="354"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;TiDB’s KeyVisualizer&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;However, these observability dimensions are still limited to the database system itself. Recently, a new trend has started to emerge: data observability, which tries to measure the quality of data. &lt;a href="https://www.anomalo.com/"&gt;Anomalo&lt;/a&gt; is a good example, and I think this will be a very promising direction for database products.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hardware infrastructure is changing dramatically.&lt;/strong&gt; As the cloud is becoming more prevalent, managed services are becoming the mainstream. When MySQL was released, there were no SSDs or 20G NICs. The advances in hardware have alleviated many problems. For example, B+Tree solved the problem of the slow reads and writes of traditional mechanical disks; however, this is not an issue with modern NVMe SSDs. With wide adoption of modern cloud environments, shared storage solutions on the cloud, such as AWS EBS, perform as well, if not better, than local disks. This will profoundly change the design of database storage engines. On the other hand, database vendors and cloud providers can offer fully managed experience on the cloud, so that users won’t have to worry about operations and maintenance and can focus on the business development. This is also a reasonable business model for vendors providing database services on the cloud.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is good old MySQL outdated?
&lt;/h2&gt;

&lt;p&gt;Having witnessed all those changes happening in the technology world, I could not help but think: is MySQL outdated? As a database kernel developer, I am more than concerned that the contribution from Oracle to MySQL is dwindling.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qXBAJwYC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h26imt0sgpj20dc09udgb.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qXBAJwYC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h26imt0sgpj20dc09udgb.jpg" alt="img" width="480" height="354"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.openhub.net/p/mysql/contributors/summary"&gt;&lt;em&gt;The growth trend of the number of MySQL contributors&lt;/em&gt; &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jpLdzMWB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h26imu5cjnj214q0g2wiw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jpLdzMWB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h26imu5cjnj214q0g2wiw.jpg" alt="img" width="880" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.openhub.net/p/mysql/commits/summary"&gt;&lt;em&gt;MySQL’s commits trend during past 3 years&lt;/em&gt; &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I don’t know what’s going on inside Oracle, and it would be great for them to make an explanation to the community. &lt;/p&gt;

&lt;p&gt;Even so, I still love MySQL and its ecosystem. The MySQL ecosystem will not go away. MySQL applications and developers are still the foundations of the database market. But do we need a more modern MySQL? Absolutely yes. In &lt;a href="https://en.pingcap.com/blog/long-live-mysql-kudos-to-the-ecosystem-innovators/"&gt;my next post&lt;/a&gt;, I will share with you &lt;a href="https://en.pingcap.com/blog/long-live-mysql-kudos-to-the-ecosystem-innovators/"&gt;some major players&lt;/a&gt; in the modern MySQL ecosystem. Stay tuned. &lt;/p&gt;




&lt;p&gt;&lt;em&gt;This post is the first part in our series. You can see the second part here: *&lt;/em&gt;&lt;a href="https://en.pingcap.com/blog/long-live-mysql-kudos-to-the-ecosystem-innovators/"&gt;Long Live MySQL: Kudos to the Ecosystem Innovators&lt;/a&gt;***.&lt;/p&gt;

</description>
      <category>mysql</category>
      <category>database</category>
    </item>
    <item>
      <title>Explore Deep in 4.6 Billion GitHub Events</title>
      <dc:creator>CYN</dc:creator>
      <pubDate>Wed, 04 May 2022 23:19:08 +0000</pubDate>
      <link>https://dev.to/yuxi903/explore-deep-in-46-billion-github-events-5bg8</link>
      <guid>https://dev.to/yuxi903/explore-deep-in-46-billion-github-events-5bg8</guid>
      <description>&lt;p&gt;4.6 billion is literally an astronomical figure. The richest star map of our galaxy, brought by Gaia space observatory, includes just under 2 billion stars. What does a view of 4.6 billion GitHub events really look like? What secrets and values can be discovered in such an enormous amount of data? &lt;/p&gt;

&lt;p&gt;Here you go: &lt;a href="https://ossinsight.io/"&gt;OSSInsight.io&lt;/a&gt; &lt;strong&gt;can help you find the answer&lt;/strong&gt;. It’s a useful insight tool that can give you the most updated open source intelligence, and help you deeply understand any single GitHub project or quickly compare any two projects by digging deep into 4.6 billion GitHub events in real time. Here are some ways you can play with it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compare any two GitHub projects
&lt;/h2&gt;

&lt;p&gt;Do you wonder how different projects have performed and developed over time? Which project is worthy of more attention? &lt;strong&gt;&lt;a href="https://ossinsight.io/"&gt;OSSInsight.io&lt;/a&gt;&lt;/strong&gt; can answer your questions via the &lt;a href="https://ossinsight.io/analyze/pingcap/tidb"&gt;Compare Projects&lt;/a&gt; page.&lt;/p&gt;

&lt;p&gt;Let’s take the &lt;a href="https://github.com/kubernetes/kubernetes"&gt;Kubernetes repository&lt;/a&gt;  (K8s) and Docker’s &lt;a href="https://github.com/moby/moby"&gt;Moby repository&lt;/a&gt; as examples and compare them in terms of popularity and coding vitality. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Popularity&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;To compare the popularity of two repositories, we use multiple metrics including the number of stars, the growth trend of stars over time, and stargazers’ geographic and employment distribution. &lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Number of stars&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;The line chart below shows the accumulated number of stars of K8s and Moby each year. According to the chart, Moby was ahead of K8s until late 2019. The star growth of Moby slowed after 2017 while K8s has kept a steady growth pace. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3S3S_LB2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h1x4hu8t19j20wn0cwaao.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3S3S_LB2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h1x4hu8t19j20wn0cwaao.jpg" alt="" width="880" height="348"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;center&gt;&lt;em&gt;The star history of K8s and Moby&lt;/em&gt;&lt;/center&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Geographical distribution of stargazers&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;The map below shows the stargazers’ geographical distribution of Moby and K8s. As you can see, their stargazers are scattered around the world with the majority coming from the US, Europe, and China.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qGTOUmfe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h1x4hy1ecvj20k00c5my9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qGTOUmfe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h1x4hy1ecvj20k00c5my9.jpg" alt="" width="720" height="437"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;center&gt;&lt;em&gt;The geographical distribution of K8s and Moby stargazers&lt;/em&gt;&lt;/center&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Employment distribution of stargazers&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;The chart below shows the stargazers’ employment of K8s (red) and Moby (dark blue). Both of their stargazers work in a wide range of industries, and most come from leading dotcom companies such as Google, Tencent, and Microsoft. The difference is that the top two companies of K8s’ stargazers are  Google and Microsoft from the US, while Moby’s top two followers are Tencent and Alibaba from China.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--U_5gzArc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h1x4i1vu7lj20ky0bs3zl.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--U_5gzArc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h1x4i1vu7lj20ky0bs3zl.jpg" alt="" width="754" height="424"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;center&gt;&lt;em&gt;The employment distribution of K8s and Moby stargazers&lt;/em&gt;&lt;/center&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Coding vitality&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;To compare the coding vitality of two GitHub projects, we use many metrics including the growth trend of pull requests (PRs), the monthly number of PRs, commits and pushes, and the heat map of developers’ contribution time.  &lt;/p&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Number of commits and pushes&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;The bar chart below shows the number of commits and pushes submitted to K8s (top) and Moby (bottom) each month after their inception. Generally speaking, K8s has more pushes and commits than Moby, and their number grew stably until 2020 followed by a slowdown afterwards. Moby’s monthly pushes and commits had a minor growth between 2015 and 2017, and then barely increased after 2018.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IXlsFkny--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h1x4i53ohyj20wn0gvgnp.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IXlsFkny--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h1x4i53ohyj20wn0gvgnp.jpg" alt="" width="880" height="455"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;center&gt;&lt;em&gt;The monthly pushes and commits of K8s (top) and Moby (bottom)&lt;/em&gt;&lt;/center&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Number of PRs&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;The charts below show the monthly and accumulated number of PRs of the two repositories. As you can see, K8s has received stable and consistent PR contributions ever since its inception and its accumulated number of PRs has also grown steadily. Moby had vibrant PR submissions before late 2017, but started to drop afterwards. Its accumulated number of PRs reached a plateau in 2017, which has remained the case ever since. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--S8EFTeIE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h1x4i8xry9j20w40h2n0v.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--S8EFTeIE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h1x4i8xry9j20w40h2n0v.jpg" alt="" width="880" height="467"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;center&gt;&lt;em&gt;The monthly and accumulated PR number of K8s (top) and Moby (bottom)&lt;/em&gt;&lt;/center&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Developers’ contribution time&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;The following heat map shows developers’ contribution time for K8s (left) and Moby (right). Each square represents one hour in a day. The darker the color, the more contributions occur during that time. K8s has many more dark parts than Moby, and K8s’ contributions occur almost 24 hours a day, 7 days a week. K8s definitely has more dynamic coding activities than Moby. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ERgiwVNS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h1x56022ruj20w706b3z6.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ERgiwVNS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h1x56022ruj20w706b3z6.jpg" alt="" width="880" height="172"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;center&gt;&lt;em&gt;Heat map of developers’ contribution time of K8s (left) and Moby (right)&lt;/em&gt;&lt;/center&gt;

&lt;p&gt;&lt;strong&gt;Taken together&lt;/strong&gt;, these metrics show that while both K8s and Moby are popular across industries world-wide, K8s has more vibrant coding activities than Moby. K8s is continuously gaining popularity and coding vitality while Moby is falling in both over time.&lt;/p&gt;

&lt;p&gt;Popularity and coding vitality are just two dimensions to compare repositories. If you want to discover more insights or compare other projects you are interested in, feel free to visit the &lt;a href="https://ossinsight.io/analyze/pingcap/tidb"&gt;Compare&lt;/a&gt; page and explore it for yourself.  &lt;/p&gt;

&lt;p&gt;Of course, you can use this same page to &lt;strong&gt;deeply explore any single GitHub project&lt;/strong&gt; and gain the most up-to-date insights about them. The key metrics and the corresponding changes are presented in a panoramic view. More in-depth analytics such as code changes by PR size groups and PR lines are also available. Explore it for yourself and you’d be surprised. Have fun. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_PBav6GN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h1x56a1rr7j20xi0egdh3.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_PBav6GN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h1x56a1rr7j20xi0egdh3.jpg" alt="" width="880" height="379"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;center&gt;&lt;em&gt;Panoramic view of key GitHub metrics (K8s as an example)&lt;/em&gt;&lt;/center&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NekfN64q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h1x56ld0u1j21070ewwhy.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NekfN64q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h1x56ld0u1j21070ewwhy.jpg" alt="" width="880" height="362"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;center&gt;&lt;em&gt;  Total PR number each month/PR groups (K8s as an example)&lt;/em&gt;&lt;/center&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--I68wYqiA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h1x56w68hlj20vg0dhta5.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--I68wYqiA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h1x56w68hlj20vg0dhta5.jpg" alt="" width="880" height="377"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;center&gt;&lt;em&gt;The number of lines of code change each month (K8s as an example)&lt;/em&gt;&lt;/center&gt;
&lt;h2&gt;
  
  
  Key open source insights
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://ossinsight.io/"&gt;OSSInsight.io&lt;/a&gt; does more than explore or compare repositories. &lt;strong&gt;It gives you &lt;a href="https://ossinsight.io/database/deep-insight-into-open-source-databases"&gt;historical, real-time, and custom open source insights&lt;/a&gt;.&lt;/strong&gt; In this section, we’ll share some key insights in open source databases and programming languages. If you want to gain insights in other areas, you can explore the &lt;a href="https://ossinsight.io/database/deep-insight-into-open-source-databases/"&gt;Insights&lt;/a&gt;  page for yourself. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: If you want to get those analytical results by yourself, you can execute the SQL commands above each chart on TiDB Cloud with ease following this &lt;a href="https://ossinsight.io/blog/try-it-yourself/"&gt;10-minute tutorial&lt;/a&gt;. &lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Rust: the most active programming language&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Rust was first released in 2012 and has been among the leading programming languages for 10 years. It has the most active repository with a total of 103,047 PRs at the time of writing.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; 
&lt;span class="cm"&gt;/*+ read_from_storage(tiflash[github_events]), MAX_EXECUTION_TIME(120000) */&lt;/span&gt;
    &lt;span class="n"&gt;programming_language_repos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;repo_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;github_events&lt;/span&gt;
         &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;programming_language_repos&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;programming_language_repos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;github_events&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;repo_id&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'PullRequestEvent'&lt;/span&gt;
  &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'opened'&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dceNXNEK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h1x575uzcmj20nm0cft9f.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dceNXNEK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h1x575uzcmj20nm0cft9f.jpg" alt="" width="850" height="447"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;center&gt;&lt;em&gt;PR numbers of the leading programming languages&lt;/em&gt;&lt;/center&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Go: the new favorite and the fastest growing programming language&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;According to &lt;strong&gt;&lt;a href="https://ossinsight.io/"&gt;OSSInsight.io&lt;/a&gt;&lt;/strong&gt;, 10 programming languages dominate the open source community. Go is the most popular with 108,317 stars, followed by Node and TypeScript. Go is also the fastest growing language in popularity.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;repo_stars&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;SELECT&lt;/span&gt;
        &lt;span class="cm"&gt;/*+ read_from_storage(tiflash[github_events]) */&lt;/span&gt;
        &lt;span class="n"&gt;repo_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;ANY_VALUE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;repos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;repo_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;distinct&lt;/span&gt; &lt;span class="n"&gt;actor_login&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;stars&lt;/span&gt;
    &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;github_events&lt;/span&gt;
         &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;programming_language_repos&lt;/span&gt; &lt;span class="n"&gt;repos&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;repos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;github_events&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;repo_id&lt;/span&gt;
    &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'WatchEvent'&lt;/span&gt;
    &lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;top_10_repos&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;SELECT&lt;/span&gt;
        &lt;span class="n"&gt;repo_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;repo_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stars&lt;/span&gt;
    &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;repo_stars&lt;/span&gt; &lt;span class="n"&gt;rs&lt;/span&gt;
    &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;stars&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;
    &lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;tmp&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;SELECT&lt;/span&gt;
        &lt;span class="cm"&gt;/*+ read_from_storage(tiflash[github_events]) */&lt;/span&gt;
        &lt;span class="n"&gt;event_year&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;tr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;repo_name&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;repo_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;year_stars&lt;/span&gt;
    &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;github_events&lt;/span&gt;
         &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;top_10_repos&lt;/span&gt; &lt;span class="n"&gt;tr&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;tr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;repo_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;github_events&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;repo_id&lt;/span&gt;
    &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'WatchEvent'&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;event_year&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;2021&lt;/span&gt;
    &lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;ASC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;tmp1&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;SELECT&lt;/span&gt;
        &lt;span class="n"&gt;event_year&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;repo_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;year_stars&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;OVER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;partition&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="n"&gt;repo_name&lt;/span&gt; &lt;span class="k"&gt;order&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="n"&gt;event_year&lt;/span&gt; &lt;span class="k"&gt;ASC&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;stars&lt;/span&gt;
    &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;tmp&lt;/span&gt;
    &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;event_year&lt;/span&gt; &lt;span class="k"&gt;ASC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;repo_name&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;event_year&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;repo_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stars&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;tmp1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tVVCW0yH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h1x57dewx6j20o90dh0tx.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tVVCW0yH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h1x57dewx6j20o90dh0tx.jpg" alt="" width="873" height="485"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;center&gt;&lt;em&gt;The star growth trends of leading programming languages&lt;/em&gt;&lt;/center&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Microsoft and Google: the top two programing languages contributors&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;As world-renowned high-tech companies, Microsoft and Google take the lead in open source language contributions with a total of 1,443 and 947 contributors respectively at the time of writing.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="cm"&gt;/*+ read_from_storage(tiflash[github_events]), MAX_EXECUTION_TIME(120000) */&lt;/span&gt;
    &lt;span class="k"&gt;TRIM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;LOWER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;REPLACE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;company&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'@'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;company&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;DISTINCT&lt;/span&gt; &lt;span class="n"&gt;actor_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                 &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;
    &lt;span class="n"&gt;github_events&lt;/span&gt; &lt;span class="n"&gt;github_events&lt;/span&gt;
    &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;programming_language_repos&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;github_events&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;repo_id&lt;/span&gt;
    &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;login&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;github_events&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;actor_login&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt;
    &lt;span class="n"&gt;github_events&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="k"&gt;IN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s1"&gt;'IssuesEvent'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'PullRequestEvent'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'IssueCommentEvent'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'PullRequestReviewCommentEvent'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'CommitCommentEvent'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'PullRequestReviewEvent'&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;company&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
    &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;company&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;
    &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;company&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s1"&gt;'none'&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---XSMbFD6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h1x57gnr9ij20pt0czmxk.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---XSMbFD6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h1x57gnr9ij20pt0czmxk.jpg" alt="" width="880" height="442"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;center&gt;&lt;em&gt;Companies who contribute the most to programing languages&lt;/em&gt;&lt;/center&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Elasticsearch draws the most attention&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Elasticsearch was one of the first open source databases. It is the most liked database with 64,554 stars, followed by Redis and Prometheus. From 2011 to 2016, Elasticseasrch and Redis shared the top spot until Elasticsearch broke away in 2017.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;repo_stars&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;SELECT&lt;/span&gt;
        &lt;span class="cm"&gt;/*+ read_from_storage(tiflash[github_events]) */&lt;/span&gt;
        &lt;span class="n"&gt;repo_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;ANY_VALUE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;repos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;repo_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;distinct&lt;/span&gt; &lt;span class="n"&gt;actor_login&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;stars&lt;/span&gt;
    &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;github_events&lt;/span&gt;
         &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;db_repos&lt;/span&gt; &lt;span class="n"&gt;repos&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;repos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;github_events&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;repo_id&lt;/span&gt;
    &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'WatchEvent'&lt;/span&gt;
    &lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;top_10_repos&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;SELECT&lt;/span&gt;
        &lt;span class="n"&gt;repo_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;repo_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stars&lt;/span&gt;
    &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;repo_stars&lt;/span&gt; &lt;span class="n"&gt;rs&lt;/span&gt;
    &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;stars&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;
    &lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;tmp&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;SELECT&lt;/span&gt;
        &lt;span class="cm"&gt;/*+ read_from_storage(tiflash[github_events]) */&lt;/span&gt;
        &lt;span class="n"&gt;event_year&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;tr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;repo_name&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;repo_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;year_stars&lt;/span&gt;
    &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;github_events&lt;/span&gt;
         &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;top_10_repos&lt;/span&gt; &lt;span class="n"&gt;tr&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;tr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;repo_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;github_events&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;repo_id&lt;/span&gt;
    &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'WatchEvent'&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;event_year&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;2021&lt;/span&gt;
    &lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;ASC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;tmp1&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;SELECT&lt;/span&gt;
        &lt;span class="n"&gt;event_year&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;repo_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;year_stars&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;OVER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;partition&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="n"&gt;repo_name&lt;/span&gt; &lt;span class="k"&gt;order&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="n"&gt;event_year&lt;/span&gt; &lt;span class="k"&gt;ASC&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;stars&lt;/span&gt;
    &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;tmp&lt;/span&gt;
    &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;event_year&lt;/span&gt; &lt;span class="k"&gt;ASC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;repo_name&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;event_year&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;repo_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stars&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;tmp1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oi3WHQvt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h1x57kef7ij20nu0drmyd.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oi3WHQvt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h1x57kef7ij20nu0drmyd.jpg" alt="" width="858" height="495"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;center&gt;&lt;em&gt;The star growth trend of leading databases&lt;/em&gt;&lt;/center&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;China: the number one fan of open source databases&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;China has the most open source database followers with 11,171 stargazers of database repositories, followed by the US and Europe.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="k"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;country_code&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;country_or_area&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="k"&gt;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="k"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;percentage&lt;/span&gt;
&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;github_events&lt;/span&gt;
&lt;span class="n"&gt;use&lt;/span&gt; &lt;span class="k"&gt;index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index_github_events_on_repo_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;left&lt;/span&gt; &lt;span class="k"&gt;join&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;github_events&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;actor_login&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;login&lt;/span&gt;
&lt;span class="k"&gt;join&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="c1"&gt;-- Get the number of people has the country code.&lt;/span&gt;
    &lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="k"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;
    &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;github_events&lt;/span&gt;
    &lt;span class="n"&gt;use&lt;/span&gt; &lt;span class="k"&gt;index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index_github_events_on_repo_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;left&lt;/span&gt; &lt;span class="k"&gt;join&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;github_events&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;actor_login&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;login&lt;/span&gt;
    &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;repo_id&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;507775&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60246359&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;17165658&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;41986369&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;16563587&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6838921&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;108110&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;166515022&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;48833910&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;156018&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50229487&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20089857&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5349565&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6934395&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6358188&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;11008207&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;19961085&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;206444&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30753733&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;105944401&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;31006158&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;99919302&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50874442&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;84240850&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;28738447&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;44781140&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;372536760&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;13124802&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;146459443&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;28449431&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;23418517&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;206417&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9342529&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;19257422&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;196353673&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;172104891&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;402945349&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;11225014&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2649214&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;41349039&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;114187903&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20587599&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;19816070&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;69400326&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;927442&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;24494032&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;and&lt;/span&gt; &lt;span class="n"&gt;github_events&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'WatchEvent'&lt;/span&gt; &lt;span class="k"&gt;and&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;country_code&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="k"&gt;not&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;
&lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;repo_id&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;507775&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60246359&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;17165658&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;41986369&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;16563587&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6838921&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;108110&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;166515022&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;48833910&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;156018&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50229487&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20089857&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5349565&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6934395&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6358188&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;11008207&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;19961085&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;206444&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30753733&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;105944401&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;31006158&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;99919302&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50874442&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;84240850&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;28738447&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;44781140&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;372536760&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;13124802&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;146459443&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;28449431&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;23418517&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;206417&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9342529&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;19257422&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;196353673&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;172104891&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;402945349&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;11225014&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2649214&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;41349039&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;114187903&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20587599&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;19816070&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;69400326&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;927442&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;24494032&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;and&lt;/span&gt; &lt;span class="n"&gt;github_events&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'WatchEvent'&lt;/span&gt; &lt;span class="k"&gt;and&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;country_code&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="k"&gt;not&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;
&lt;span class="k"&gt;group&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;order&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;desc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yC59EYDq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h1x57nrlbzj20sw0hngo8.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yC59EYDq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tva1.sinaimg.cn/large/e6c9d24egy1h1x57nrlbzj20sw0hngo8.jpg" alt="" width="880" height="537"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;center&gt;&lt;em&gt;The geographical distribution of open source database stargazers&lt;/em&gt;&lt;/center&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://ossinsight.io/"&gt;OSSInsight.io&lt;/a&gt;&lt;/strong&gt; also allows you to create your own custom insights into any GitHub repository created after 2011. You’re welcome to visit the &lt;a href="https://ossinsight.io/database/deep-insight-into-open-source-databases"&gt;Insights page&lt;/a&gt; to explore more. &lt;/p&gt;

&lt;h2&gt;
  
  
  Run your own analytics with TiDB Cloud
&lt;/h2&gt;

&lt;p&gt;All the analytics on &lt;strong&gt;&lt;a href="https://ossinsight.io/"&gt;OSSInsight.io&lt;/a&gt;&lt;/strong&gt; are powered by &lt;a href="https://en.pingcap.com/tidb-cloud/"&gt;TiDB Cloud&lt;/a&gt;, a fully-managed database as a service. If you want to run your own analytics and get your own insights, &lt;a href="https://tidbcloud.com/signup?utm_source=ossinsight"&gt;sign up for a TiDB Cloud account&lt;/a&gt; and try it for yourself with this &lt;a href="https://ossinsight.io/blog/try-it-yourself/"&gt;10-minute tutorial&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contact us
&lt;/h2&gt;

&lt;p&gt;Do you find &lt;strong&gt;&lt;a href="https://ossinsight.io/"&gt;OSSInsight.io&lt;/a&gt;&lt;/strong&gt; useful and fun to work with? Do you have any question or feedback to share with us? Feel free to &lt;a href="https://github.com/pingcap/ossinsight/issues/new"&gt;file an issue&lt;/a&gt; on GitHub or follow us on &lt;a href="https://twitter.com/OSSInsight/"&gt;Twitter&lt;/a&gt; to get the latest information. You’re also welcome to share this insight tool with your friends. &lt;/p&gt;

</description>
      <category>opensource</category>
      <category>github</category>
    </item>
  </channel>
</rss>
