真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

優(yōu)化MYSQL查詢的詳細(xì)方法

不知道大家之前對(duì)類似優(yōu)化MySQL查詢的詳細(xì)方法的文章有無(wú)了解,今天我在這里給大家再簡(jiǎn)單的講講。感興趣的話就一起來(lái)看看正文部分吧,相信看完優(yōu)化MYSQL查詢的詳細(xì)方法你一定會(huì)有所收獲的。                                                             

在承德縣等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站制作、成都網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作按需規(guī)劃網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都營(yíng)銷網(wǎng)站建設(shè),外貿(mào)網(wǎng)站建設(shè),承德縣網(wǎng)站建設(shè)費(fèi)用合理。

1. 在所有用于where,order by和group by的列上添加索引

索引除了能夠確保唯一的標(biāo)記一條記錄,還能是MySQL云服務(wù)器更快的從數(shù)據(jù)庫(kù)中獲取結(jié)果。索引在排序中的作用也非常大。

Mysql的索引可能會(huì)占據(jù)額外的空間,并且會(huì)一定程度上降低插入,刪除和更新的性能。但是,如果你的表格有超過(guò)10行數(shù)據(jù),那么索引就能極大的降低查找的執(zhí)行時(shí)間。

強(qiáng)烈建議使用“最壞情況的數(shù)據(jù)樣本”來(lái)測(cè)試MySql查詢,從而更清晰的了解查詢?cè)谏a(chǎn)中的行為方式。

假設(shè)你正在一個(gè)超過(guò)500行的數(shù)據(jù)庫(kù)表中執(zhí)行如下的查詢語(yǔ)句:

mysql>select customer_id, customer_name from customers where customer_id='345546'

上述查詢會(huì)迫使Mysql云服務(wù)器執(zhí)行一個(gè)全表掃描來(lái)獲得所查找的數(shù)據(jù)。

型號(hào),Mysql提供了一個(gè)特別的Explain語(yǔ)句,用來(lái)分析你的查詢語(yǔ)句的性能。當(dāng)你將查詢語(yǔ)句添加到該關(guān)鍵詞后面時(shí),MySql會(huì)顯示優(yōu)化器對(duì)該語(yǔ)句的所有信息。

如果我們用explain語(yǔ)句分析一下上面的查詢,會(huì)得到如下的分析結(jié)果:

mysql> explain select customer_id, customer_name from customers where customer_id='140385';
+----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table     | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | customers | NULL       | ALL  | NULL          | NULL | NULL    | NULL |  500 |    10.00 | Using where |
+----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------------+

可以看到,優(yōu)化器展示出了非常重要的信息,這些信息可以幫助我們微調(diào)數(shù)據(jù)庫(kù)表。首先,MySql會(huì)執(zhí)行一個(gè)全表掃描,因?yàn)閗ey列為Null。其次,MySql云服務(wù)器已經(jīng)明確表示它將要掃描500行的數(shù)據(jù)來(lái)完成這次查詢。

為了優(yōu)化上述查詢,我們只需要在customer_id這一列上添加一個(gè)索引m即可:

mysql> Create index customer_id ON customers (customer_Id);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

如果我們?cè)俅螆?zhí)行explain語(yǔ)句,會(huì)得到如下結(jié)果:

mysql> Explain select customer_id, customer_name from customers where customer_id='140385';
+----+-------------+-----------+------------+------+---------------+-------------+---------+-------+------+----------+-------+
| id | select_type | table     | partitions | type | possible_keys | key         | key_len | ref   | rows | filtered | Extra |
+----+-------------+-----------+------------+------+---------------+-------------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | customers | NULL       | ref  | customer_id   | customer_id | 13      | const |    1 |   100.00 | NULL  |
+----+-------------+-----------+------------+------+---------------+-------------+---------+-------+------+----------+-------+

從上述的輸出結(jié)果,顯然MySQL云服務(wù)器會(huì)使用索引customer_id來(lái)查詢表格。可以看需要掃描的行數(shù)為1。雖然我只是在一個(gè)行數(shù)為500的表格中執(zhí)行這條查詢語(yǔ)句,索引在檢索一個(gè)更大的數(shù)據(jù)集的時(shí)候優(yōu)化程度更加明顯。

2. 用Union優(yōu)化Like語(yǔ)句

有時(shí)候,你可能需要在查詢中使用or操作符進(jìn)行比較。當(dāng)or關(guān)鍵字在where子句中使用頻率過(guò)高的時(shí)候,它可能會(huì)使MySQL優(yōu)化器錯(cuò)誤的選擇全表掃描來(lái)檢索記錄。union子句可以是查詢執(zhí)行的更快,尤其是當(dāng)其中一個(gè)查詢有一個(gè)優(yōu)化索引,而另一個(gè)查詢也有一個(gè)優(yōu)化索引的時(shí)候。

比如,在first_name和last_name上分別存在索引的情況下,執(zhí)行如下查詢語(yǔ)句:

mysql> select * from students where first_name like 'Ade%' or last_name like 'Ade%'

上述查詢和下面使用union合并兩條充分利用查詢語(yǔ)句的查詢相比,速度慢了許多。

mysql> select * from students where first_name like 'Ade%' union all select * from students where last_name like 'Ade%'

3. 避免使用帶有前導(dǎo)通配符的表達(dá)式

當(dāng)查詢中存在前導(dǎo)通配符時(shí),Mysql無(wú)法使用索引。以上面的student表為例,如下的查詢會(huì)導(dǎo)致MySQL執(zhí)行全表掃描,及時(shí)first_name字段上加了索引。

mysql> select * from students where first_name like '%Ade'

使用explain分析得到如下結(jié)果:

mysql> explain select * from students where first_name like  '%Ade'  ;
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table    | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | students | NULL       | ALL  | NULL          | NULL | NULL    | NULL |  500 |    11.11 | Using where |
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------------+

如上所示,Mysql將掃描全部500行數(shù)據(jù),這將使得查詢極其緩慢。

4. 充分利用MySQL的全文檢索

如果你正面臨著使用通配符查詢數(shù)據(jù),但是并不想降低數(shù)據(jù)庫(kù)的性能,你應(yīng)當(dāng)考慮使用MySQL的全文檢索(FTS),因?yàn)樗韧ㄅ浞樵兛斓枚?。除此以外,F(xiàn)TS還能夠返回質(zhì)量更好的相關(guān)結(jié)果。

添加一個(gè)全文檢索索引到student樣表上的語(yǔ)句如下:

mysql> alter table students add fulltext(first_name, last_name)';
mysql> select * from students where match(first_name, last_name) against ('Ade');

在上面的例子中,我們針對(duì)搜索關(guān)鍵字Ade指定了想要匹配的列(first_name, last_name)。如果查詢優(yōu)化器如上語(yǔ)句的執(zhí)行情況,將得到下面的結(jié)果:

mysql> explain Select * from students where match(first_name, last_name) AGAINST ('Ade');
+----+-------------+----------+------------+----------+---------------+------------+---------+-------+------+----------+-------------------------------+
| id | select_type | table    | partitions | type     | possible_keys | key        | key_len | ref   | rows | filtered | Extra                         |
+----+-------------+----------+------------+----------+---------------+------------+---------+-------+------+----------+-------------------------------+
|  1 | SIMPLE      | students | NULL       | fulltext | first_name    | first_name | 0       | const |    1 |   100.00 | Using where; Ft_hints: sorted |
+----+-------------+----------+------------+----------+---------------+------------+---------+-------+------+----------+-------------------------------+

5. 優(yōu)化數(shù)據(jù)庫(kù)架構(gòu)

規(guī)范化

首先,規(guī)范化所有數(shù)據(jù)庫(kù)表,即使可能會(huì)有些損失。比如,如果你需要?jiǎng)?chuàng)建兩張表分別用來(lái)記錄customers和orders數(shù)據(jù),你應(yīng)當(dāng)在order表上用顧客id引用顧客,而不是反過(guò)來(lái)。下圖顯示了沒(méi)有任何數(shù)據(jù)冗余而設(shè)計(jì)的數(shù)據(jù)庫(kù)架構(gòu)。

優(yōu)化MYSQL查詢的詳細(xì)方法

除此以外,對(duì)相似的值使用同一種數(shù)據(jù)類型類存儲(chǔ)。

使用最佳數(shù)據(jù)類型

MySQL支持各種數(shù)據(jù)類型,包括integer,float,double,date,datetime,varchar,text等。當(dāng)設(shè)計(jì)數(shù)據(jù)庫(kù)表時(shí),應(yīng)當(dāng)盡可能使用能夠滿足特性的最短的數(shù)據(jù)類型。

比如,如果你在設(shè)計(jì)一個(gè)系統(tǒng)用戶表,而該用戶數(shù)量不會(huì)超過(guò)100個(gè)人,你就應(yīng)該對(duì)user_ud使用'TINYINT'類型,該類型的取值范圍為-128至128。如果一個(gè)字段需要存儲(chǔ)date型值,使用datetime類型比較好,因?yàn)樵诓樵兊臅r(shí)候無(wú)需進(jìn)行復(fù)雜的類型轉(zhuǎn)換。

當(dāng)值全為數(shù)字類型時(shí),使用Integer。在進(jìn)行計(jì)算時(shí),Integer類型的值比文本類型的值速度更快。

避免NULL

NULL指該列沒(méi)有任何值。你應(yīng)當(dāng)盡可能的避免這類型的值因?yàn)樗麄儠?huì)損害數(shù)據(jù)庫(kù)結(jié)果。比如你需要獲得數(shù)據(jù)庫(kù)中所有訂單金額的和,但是某個(gè)訂單記錄中金額為null,如果不注意空指針,很有可能導(dǎo)致計(jì)算結(jié)果出現(xiàn)異常。在某些情況下,你可能需要為列定義一個(gè)默認(rèn)值。

看完優(yōu)化MYSQL查詢的詳細(xì)方法這篇文章,大家覺(jué)得怎么樣?如果想要了解更多相關(guān),可以繼續(xù)關(guān)注我們的行業(yè)資訊板塊。


分享標(biāo)題:優(yōu)化MYSQL查詢的詳細(xì)方法
當(dāng)前鏈接:http://weahome.cn/article/pgcssc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部