 Hello everyone. Oh, I wasn't waiting for a response. I actually just arrived today in the morning, so I have a terrible jet lag, so if I stall for a few seconds, you know, that's one. Yeah, and oh, also I brought some t-shirts to give away for some good questions, but they already have been disappeared. Oh, look at that. They are appearing back. Fantastic. Yeah, so I have a couple of t-shirts and a couple of chargers. So for those who ask questions and, you know, if you will be shy and not ask any questions, I'm planning to give away anyway. So I just don't have to take them back. Anyway, so as the gentleman mentioned, I'm the CEO of Pure Corner, and if you wonder what Pure Corner is and what we do, we provide the solutions for the open source databases. MySQL, that is what we started with and I think most well known for, but as well as MariaDB, MongoDB, and now we even announced support for Postgres, right? Just recently, I think about a month ago. We do support managed services, consulting, training, and we also produce a lot of software. What is interesting about our software is what all the software we do is completely open source. We don't do open core, we believe, in enterprise grade, but completely free and open source software. And also another thing which is interesting about Pure Corner is while we have our own software, we support the large ecosystem, right? So wherever you have your own MySQL, MariaDB, or maybe some cloud database like Amazon RDS, Aurora, Google Cloud SQL, we got you covered. We've been in business for now almost 12 years and served really more than 300 customers at this point, including many of the top Internet companies, right? As well as some even Singapore-based ones, as well as many large retailers and so on and so forth. Okay, MySQL 8. Anybody tried MySQL 8 here? Oh, look at that, okay. Let's get back. Anybody heard about MySQL here? Oh, free hands. Wow, that's fantastic. Okay, so what MySQL version guys are running? Five-seven, anyone? Five-seven. Five-seven. Five-six? Anyone five-six? No? Okay. No, don't care, right? Some MySQL, I can run queries on it, right? And it works, right? So, oh, I see for some it doesn't. Okay, cool. So MySQL 5.7 was a previous version. Anybody knows why this one is called MySQL 8? Well, what company runs, owns MySQL, do you guys know? Oracle. Oracle, and if you put two O's together, what is it going to be like? That's going to be eight, right? Well, but that's really not the real story. The real story is actually even worse. So, obviously, marketing decided what was the time for major version change, because MySQL 5.0, I think, was released at least 10 years ago. I don't even remember how far alone, but I think it's more than 10 years ago. Yeah, well, a long time ago, right? So, actually, MySQL 6 was already busy with some sort of failed project. Back then in 2000, there was a MySQL 6.0.3, which just was never, at each kind of maturity, was abandoned in favor of, I think, MySQL 5.5. Version 7 was used by MySQL cluster for many years, right? And they decided, hey, we skip that as well, unify all together. It will be MySQL 8, and that's also instead of MySQL 5.8, and that's also very simple change by dropping the 5 together, right? So, if you heard about MySQL 5.8 before and now hear about MySQL 8, that's the same stuff as just what it became after marketing got hands on the naming. And it's also finally GA, right? Or was released stable, recommended for production by Oracle. That is, and that happened just about a month ago. So, that is really, really fresh off the press. Now, I want to highlight something that's important as a full disclosure. A lot of examples here. I borrowed liberally from Oracle documentation. There are other pages, right? So, I want to give you credit where it's due. And this presentation is actually part of a bigger presentation. I have a MySQL about MySQL 8, which covers both features for developers and for ops people. But as you guys just gave me half an hour, I removed anything operationally focused and left only developer-focused stuff right here. Now, the first thing which is interesting and important in MySQL 8 is the character set change. Versions before MySQL 8 were with Latin 1 character set as default and Latin 1 doesn't really go very far in Asia, right? Well, but even in America, it doesn't really go that far anymore because you know what? Everybody goes mobile right now and you know what at least half of characters using mobile is emojis. And emojis is UTF-8 and even in particular UTF-8 MB4, right? And this is the reason what UTF-8 MB4 is default character set in MySQL 8 and there was a lot of work done optimizing that thing in MySQL 8. And that is important, right? Because if you look at a lot of benchmark which people publish everywhere on the Internet, many of them are Latin 1 because that's default and well, because frankly it worked faster. So that is an important change. Yeah? Is the MB4 part mean? Oh, what does MB4 mean? Okay, so MB stands for multi-byte, right? So four, that means four bytes. So in MySQL, previous versions of MySQL, right? So first, MB3 appear, right? And that means dynamic length using up to three characters, right? And it would allow to express a lot of UTF-8 characters but not all of them, right? Particular emojis they are in, they only expressed in the MB4 sequence. So, okay. Now another interesting feature which developers can use is now in ADB storage engine and pretty much 99% of folks are using in ADB storage engine right now even we realized it or not. It has these very nice features as no-weight or skip locked. What does no-weight means? It means I run the query and if it has to wait on some roll-over locks, I can just throw an error immediately, right, in some cases. But this already could be stimulated before just more painfully, right? I could just set in ADB lock wait time out to zero and that would work approximately the same way. This feature is even more cool. What it says and say when you're doing select for update, skip locked. That means if a certain rows are locked, then you can just skip them. And that is very helpful in a situation for example when you want to do something like ticket reservation, right? Maybe some people are already, you know, booking some of the places. It's much better to skip them and show people other available seats, right? Then just to wait for that, right? It can really make all the process much more efficient. And skip locked is really something which is very hard to work around on an application level if that doesn't exist. Another nice feature is descending indexes. So what is that and why is it important? So then you run the queries if order by, right? Then for that query to be fast, you want to make sure the order by clause matches the index, right? Now, in a previous MySQL versions, you could create the indexes which say, hey, I sort that by, I don't know, let's say, age in descending order and by, you know, location right where in ascending order, right? You could do those things but MySQL would ignore those definitions and build the index by ascending order in both columns. And that means you could not really write the queries which sort in the different order by columns which use the index. And that would require you to do some like a very crazy work arounds. Like you say, well, you know what, if I need to sort by this column, let me create another column and make it negative. Well, that's easy for integers, right? But if you want to do something which is kind of negative for strings, that kind of becomes a bit more painful, right? For example, so that is a very cool feature which allows you to get queries when you sort by columns in a different order. Another big focus of MySQL since version 5.7 and I think really culminating MySQL 8 is support for JSON, right? A lot of developers, especially front-end developers, they like to get the data in JSON notation. So it's much easier for them to work with that than with, you know, other format. And what now MySQL allows you is to get your relational data and kind of pack it either to the essentially the set of JavaScript objects, right? Or you can even put that together to create one, all your results set as pretty one as big JSON object, which is kind of very easy for developers to work in JavaScript, right? And you don't have to have your application layer doing that prep work for you. But what is even more cool in this case is what now you can do the opposite as well. You can do the JSON object and you can use that kind of JSON table function to essentially convert that and provide you some of the inline table from which you can select, right? You can see in this case I have JSON object, which is in this case this array. I say, hey, I want to convert that as a table, which will have two values. The first one will be Rho ID and the second one will be those values, right? And then I get a table in result. Now, why is it helpful? Well, now think about that. I can now use that to do things like group by or to do join, right? Based on the data which I stored in JSON object, which allow you to do some really, really cool stuff. Now, there was also a lot of work done to help extract the data from JSON. In many cases when you have your JSON object, you may not want to get all the data to select all the data from it, right? For example, in this case we can, when working with arrays, we can select not just a single element which was already supported but in this case we are selecting elements from one to three, right? And as you can see in this case where counter kind of goes from zero, right? Or you can say, hey, what is the element which is the last minus two, right? So that allows you to select by position not only from a star but from an end, right? Which is also quite convenient. The next thing I go into there, more practical SQL support. Now, one of my SQL limitations was often it did not support a lot of SQL, modern SQL standard features. For example, common table expressions or CTEs. And CTEs are very helpful to build various recursive queries, right? Like this one, for example, when you want to operate something like a three-like structures in the database, right? So in this case it's kind of complicated but in this case what we do is we retrieve the data which goes from the star of a tree, right? Of a depth zero all the way inside the tree, right? And kind of pulls out all the subtree of categories of a single select. Now, CTEs, if that looks complicated, well, it is not. CTEs are very powerful. There is actually you can find it per Kona's blog Sudoku Solver which is written as a recursive CTE, right? So you can really do a lot of their fancy stuff out there. And then the second thing is window functions. That is another thing which is very helpful for some data analysis applications. Again, this is kind of pretty trivial example here to explain what it works, how it works, right? Window functions allow you pretty much apply something like a group by function but compute that for each row, right? Like in this case you can see we are having a table where we are applying a computing sum as a window function, right? Now you'd say why is that really useful? On itself it may not be that useful. What is really power comes from this over close which really allows you to have a lot of very fancy use cases, right? For example, you can compute things as moving averages using this stuff, right? We've had over, for example, say, hey, I want to compute the sum of the three elements one before one after each of the elements in the set, right? Or stuff like that. That stuff is really powerful, right? I would suggest to check out with some examples. Okay, the next one is much better GIS. GIS is getting increasingly more important, right? If so many geolocation-enabled applications and so on and so forth. And MySQL had support before, right? And it was actually quite already improved MySQL 5.7. But in 8, it really was focused to really kind of catch up, right? And exceed PostgreSQL JS set. And really, I mean, if you ask PostgreSQL folks, they probably wouldn't agree with something like that. But there was a lot of work done out there. And I don't really, I'm not the big expert in GIS particular, but I talk to developers that are like really fascinating stuff, right? So for example, it turns out what different countries they are using or even kind of different locations within the country, they may use different set of coordinates, right? Because while looking at the Earth as a sphere, right? Or even as kind of really kind of like the modified sphere works if you want to find, you know, all the coffee shops in approximately 10 miles distance, right? That's easy. Now, if you move to some more particular GPS applications, for example, saying, well, I own this kind of plot of land, right? What exactly is that border? And if you need the accuracy which is measured in centimeters, not in meters, right? Then you can't really use that. You need a much more specific reference system. And that is what MySQL empowers among a lot of other advanced features for GIS. Now, another thing is document store. And also document store MySQLers. Anyone? Okay. So document store, that is a new feature introduced in MySQL 5.7, actually, which allows you to use MySQL pretty much as if it were MongoDB, right? You can really use a very similar CRUD API to put and retrieve JSON objects from it, right? And with MySQL 8, there are also a number of improvements such as full-text search, indexing, and geodejson support, right? So that has continued to improve. And now, finally, very hot from the press is this thing called Instant Add Column. That is not in the latest MySQL release, but that's coming up, I think, in the next few months or so. And this allows you to add the column instantly even to very large tables by pretty much just modifying the metadata, right? And not doing any kind of data changes. That is the difference between Instant and Online, right? What does Online mean? Online means what the operation happens online, so your queries are not blocked, right? But it can be still very heavy, right? If you have to reveal a couple of terabytes stable, even if it happens online, it may take many hours to complete taking all the server resources. Instant, that means none of that happens, it's just metadata modification. And that was contributed by Tencent Games, right? A company from China. And why point this out? Because there is some rumors, like saying, oh, Oracle in MySQL, they never accept any contributions from anyone. Well, actually they do, right? I mean, they are, I mean, I think they're taking pretty good care with MySQL development out there. Something else you need to know as developer is what in MySQL 8 it defaults to the user authentication of improved security, which is kind of A2 based with some performance optimizations and so on and so forth, right? Which is all great, but this new protocol is not really available for all the languages, right? Not every language driver has been updated. I think, for example, support for Go language was just committed two days ago, right? I know because I report a bug what it doesn't work with MySQL 8. So a lot of legacy drivers may not work out of a box of MySQL 8. The good thing is there is actual solution, which is called MySQL native password. You can just say, hey, you can even create the user to use the legacy authentication scheme called MySQL native password, or you can even make it used by default, right? MySQL 8, actually, if you install it, it will even ask you, at least on Devin and Ubuntu-based distributions, hey, what do you want to do? Do you want improved authentication security or do you want compatibility, right? And you can set that, but that is important because many developers are beaten by this because many libraries are not updated, yes. Okay, well, that's pretty much a quick overview of developers. I hope you find something cool in MySQL 8, which you can put into use. And then I think you have a couple of shameless or not so shameless plugs. One is the Iranian conference, Purcona Live Europe, which will take place in Frankfurt, Germany. So if somebody likes to travel, we welcome you to either submit the talk, or it doesn't have to be about MySQL. We really care about all the open source databases right now. Or you obviously are welcome to come and attend as well. And then an IP, which I think is maybe particularly interesting for the group of developers. We have in Purcona over the last years have been putting a lot of work in this tool called Purcona-Monten and Management. And that really allows you to get a lot of observability or operational intelligence in MySQL. It has a lot of fancy graphs like that. Now, the feature, which I think is the most important for developers particularly, is what that also allows you to look at the queries and which of the queries is causing the most load on MySQL so you can go ahead and fix it. And what my recommendation is to figure out how to use those with your development system or something so you can make sure you understand the cost of the queries you're running before you go into production and fix them because there are so many down times I've been caused by kind of bad queries one way or another making that to a production system. Okay, that's it. Any questions? No? No questions? It's like, oh, yeah. That's right, yeah. So from database, the technologies which we cover at Purcona would be MySQL and MariaDB, wherever you would call it, same or different, that's up to you. MongoDB and Postgres. So can you make a comment about the comparison of Postgres to MySQL? I've spent a lot of the features already in Postgres. Yeah, a lot of those features are in Postgres. That's right. Now, there was a pretty in-depth standard comparison. I would say there are some features in those CTE implementation which exist in MySQL, which are not in Postgres as well. But I would say in general, Postgres has been more powerful in terms of SQL language support for years for most of things. Like, for example, partitioning was not there in Postgres as partitioning until very recently. Where Postgres from my standpoint runs behind still is replication. Even though there is a logical replication available now in Postgres, it's not as robust as MySQL's. Do you want to claim your t-shirt? Sure. Okay, I have your choice of... I mean, different sizes or not, let me see. One is M and one is L, whatever. M? Yes. Okay, any other questions? Thank you. Oh, okay. Does Precona publish or plan to publish any Heroku add-ons? Heroku add-ons? Well, we don't publish right now, but that is a good thing for us to consider. What you would like to see? I don't know much about your tools, but I think they seem reasonable. I think because most of us are on Heroku in some way or another, either at work or with our pet projects, it could be an interesting way to explore it. Okay, now that is interesting. I would say for us, we did not get a lot of requests for Heroku in particular. I think a lot of people, for our stuff, they look either integration of some automation frameworks, like a puppet, Chef, Ansible, or Docker, is a pretty hot thing right now. Okay, do you want a t-shirt? I can take it. Okay. Yeah. Okay. I have a questions. I need at least two more questions, right, so we don't have to pick random people. No? Who cares about my school anyway, right? You could take this offline. Okay, that's fine.