MySQL details (----------) Optimization of paging query for massive data

Source: Internet
Author: User
Tags mysql index

For a detailed explanation of the page, see http://blog.csdn.net/u011225629/article/details/46775947

View Code Print 1 SELECT * FROM table ORDER by ID LIMIT 1000, 10;
The above SQL statements in principle and in the actual operation is not a problem, but when the table data volume reaches more than hundreds of thousands of of the time, the above statement executes once, it may take a few seconds, and when the number of pages, the more time to execute the longer, This time we need to find a faster way to replace this kind of operation.

There are many ways to optimize the Internet, basically this is:

View Code Print 1 SELECT * FROM table WHERE ID >= (SELECT id from table limit 1000000, 1) limit 10;
The above SQL statement is a good solution, the speed of the paging query will remain within 1 seconds, but according to experience, there is a better approach, as follows:

View Code Print 1 SELECT * FROM table WHERE ID between 1000000 and 1000010;
Compared with the above solution, the speed will be much faster.

Also share two tips on querying:

(1) If a query ID is not contiguous, the best thing to do is to find the ID first and then use in query:

View Code Print 1 SELECT * FROM table WHERE ID in (10000, 100000, 1000000 ...);
(2) When querying the field a longer string, the table design to add a field for the field, such as the field to store the URL, when you need to query the field, do not query the string directly, inefficient, should be the CRC32 or MD5 value of the character string.

How to optimize MySQL Tens fast paging, the following excerpt and online, the reader's own reference.

How high can MySql performance be? Using PHP for more than half a year, really so deep to think about this problem or from the day before yesterday. There has been pain and despair, to now full of confidence! MYSQL This database is definitely suitable for DBA level master to play, generally do a little 10,000 news small system How to write all can, with XX framework can achieve rapid development. But the amount of data to 100,000, million to tens of millions, his performance can be so high? A little bit of error, may cause the entire system rewrite, even more this system does not work properly! Well, not so much nonsense. To speak with facts, see examples:

Data table collect (ID, title, info, VType) on these 4 fields, where title is fixed length, info with text, ID is gradual, VType is Tinyint,vtype is index. This is a simple model of a basic news system. Now fill in the data, fill in 100,000 news. The last collect is 100,000 records, the database table occupies the hard disk 1.6G. OK, look at the following SQL statement:

Select Id,title from collect limit 1000, 10; Very quickly, basically 0.01 seconds ok, and then look at the following

Select Id,title from collect limit 90000, 10; Starting from 90,000 pages, results?

8-9 seconds to complete, what's wrong with my God? In fact, to optimize this data, online find the answer. Look at the following statement:

Select ID from collect order by ID limit 90000, 10;

Soon, 0.04 seconds will be OK. Why? Because using the ID primary key to do the index is of course fast. The method of online modification is:

Select Id,title from collect where id>= (select ID from collect order by ID limit 90000,1) limit 10;

This is the result of indexing with an ID. But the problem is so complicated that it's finished. Look at the following statement

Select ID from collect where vtype=1 the order by ID of limit 90000, 10; It's slow, it took 8-9 seconds!

Here I believe a lot of people will be like me, have a crash feeling! VType, did you index it? How can it be slow? VType did an index is good that you directly

Select ID from collect where vtype=1 limit 1000, 10;

is very fast, basically 0.05 seconds, but increase 90 times times, starting from 90,000, that is 0.05*90=4.5 second speed. And the test results were 8-9 seconds to an order of magnitude. From here, some people put forward the idea of the table, this and dis #cuz forum is the same idea. Ideas are as follows:

Build an Index Table: T (id,title,vtype) and set the fixed length, then do the paging, page out the results and then to collect inside to find info. Is it feasible? I know it under the experiment.

100,000 records to T (id,title,vtype), data table size about 20M. Use

Select ID from t where vtype=1 the order by ID of limit 90000, 10;

Soon enough. Basically 0.1-0.2 seconds can run out. Why is that? I guess it's because collect data is too much, so it's a long way to go. Limit is fully related to the size of the data table. In fact, this is still a full-scale scan, just because the amount of data is small, only 100,000 fast. OK, a crazy experiment, add to 1 million, test performance. With 10 times times the data, the T-table is now over 200 m, and it's a fixed length. Or just the query statement, the time is 0.1-0.2 seconds to complete! Table Performance No problem? Wrong! Because our limit is still 90,000, so fast. Give me a big one, 900,000 start.

Select ID from t where vtype=1 the order by ID of limit 900000, 10;

Look at the results, the time is 1-2 seconds! Why?

The time is still so long, very depressed! Someone agreed long will improve the performance of limit, at first I also think, because a record length is fixed, MySQL should be able to calculate the position of 900,000 is right ah? But we overestimate the intelligence of MySQL, he is not a business database, it turns out that fixed length and non-fixed length have little effect on limit? No wonder someone said Discuz to 1 million records will be very slow, I believe this is true, this and database design related!

Can't mysql exceed the 1 million limit??? To 1 million of the page is really the limit?

The answer is: no why can't break through 1 million because not design MySQL caused. The Non-table method is described below, to a crazy test! A table of 1 million records, and 10G database, how to quickly page!

Well, our test goes back to the Collect table, and the test concludes:

300,000 data, using the Sub-table method is feasible, more than 300,000 of his speed will a slow line you unbearable! Of course, if I use the Sub-table + This method, it is absolutely perfect. But after using this method of mine, I can solve the problem without a table.

The answer is: Composite Index! Once the MySQL index was designed, inadvertently found that the index name can be taken, you can choose a few fields come in, what is the use of it? Started with

Select ID from collect order by ID limit 90000, 10;

So fast is because of the index, but if the addition of where will not go index. With the idea of a try, add the index such as search (Vtype,id). and then test

Select ID from collect where vtype=1 limit 90000, 10; Very fast! 0.04 seconds to complete!

Re-test: Select ID, title from collect where vtype=1 limit 90000, 10; Very sorry, 8-9 seconds, did not go search index!

Re-test: Search (Id,vtype), or select ID this statement, also very regrettable, 0.5 seconds.

In summary: If for a where condition, and want to go index with limit, you must design an index, where the first place, limit the primary key to put 2nd bit, and only select the primary key!

The perfect solution to the paging problem. You can quickly return to the ID to have the hope of optimizing the limit, according to such logic, millions limit should be in 0.0x seconds can be divided. It seems that MySQL statement optimization and indexing is very important!

Well, back to the original question, how to apply the above research successfully to the development? If you use compound queries, my lightweight framework is useless. Paging string you have to write it yourself, how much trouble? Here we look at an example, and the idea comes out:

SELECT * from collect where ID in (9000,12,50,7000); 0 seconds to check it out!

Mygod, MySQL's index is also valid for in statements! It seems that the online say in cannot be indexed is wrong!

With this conclusion, it is easy to apply the lightweight framework:

With a simple transformation, the idea is simple:

(1) by optimizing the index, find the ID, and spell "123,90000,12000″ such a string."

(2) The 2nd query finds the results. Small index + a little bit of change makes it possible for MySQL to support millions or even tens efficient paging!

From the example here, I reflect on the point: for large systems, PHP must not use the framework, especially the kind of SQL statements can not see the framework! Because the beginning of my lightweight framework almost collapsed! Only for the rapid development of small applications, for Erp,oa, large Web sites, the data layer including the logical layer of things can not be used in the framework. If the programmer loses control of the SQL statement, the risk of the project will increase exponentially! Especially with MySQL, MySQL must be a professional DBA to perform his best performance. The performance difference caused by an index can be thousands of thousand!

Copyright NOTICE: Welcome to reprint, hope to reprint the same time add the original address, thank you for your cooperation, learning happy!

MySQL details (----------) Optimization of paging query for massive data

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.