不知道大家之前對類似優(yōu)化MySQL有哪些技巧的文章有無了解,今天我在這里給大家再簡單的講講。感興趣的話就一起來看看正文部分吧,相信看完優(yōu)化MySQL有哪些技巧你一定會有所收獲的。
創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比墨竹工卡網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式墨竹工卡網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋墨竹工卡地區(qū)。費用合理售后完善,十年實體公司更值得信賴。
1、在所有用于where,order by和group by的列上添加索引
1)索引除了能夠確保唯一的標(biāo)記一條記錄,還能是MySQL云服務(wù)器更快的從數(shù)據(jù)庫中獲取結(jié)果。索引在排序中的作用也非常大。
Mysql的索引可能會占據(jù)額外的空間,并且會一定程度上降低插入,刪除和更新的性能。但是,如果你的表格有超過10行數(shù)據(jù),那么索引就能極大的降低查找的執(zhí)行時間。
2)強(qiáng)烈建議使用“最壞情況的數(shù)據(jù)樣本”來測試MySql查詢,從而更清晰的了解查詢在生產(chǎn)中的行為方式。
3)假設(shè)你正在一個超過500行的數(shù)據(jù)庫表中執(zhí)行如下的查詢語句:
mysql>select customer_id, customer_name from customers where customer_id='345546'
上述查詢會迫使Mysql云服務(wù)器執(zhí)行一個全表掃描來獲得所查找的數(shù)據(jù)。
4)型號,Mysql提供了一個特別的Explain語句,用來分析你的查詢語句的性能。當(dāng)你將查詢語句添加到該關(guān)鍵詞后面時,MySql會顯示優(yōu)化器對該語句的所有信息。
如果我們用explain語句分析一下上面的查詢,會得到如下的分析結(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ù)庫表。首先,MySql會執(zhí)行一個全表掃描,因為key列為Null。其次,MySql云服務(wù)器已經(jīng)明確表示它將要掃描500行的數(shù)據(jù)來完成這次查詢。
5)為了優(yōu)化上述查詢,我們只需要在customer_id這一列上添加一個索引m即可:
mysql> Create index customer_id ON customers (customer_Id); Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0
如果我們再次執(zhí)行explain語句,會得到如下結(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 | +----+-------------+-----------+------------+------+---------------+-------------+---------+-------+------+----------+-------+
2. 用Union優(yōu)化Like語句
1)有時候,你可能需要在查詢中使用or操作符進(jìn)行比較。當(dāng)or關(guān)鍵字在where子句中使用頻率過高的時候,它可能會使MySQL優(yōu)化器錯誤的選擇全表掃描來檢索記錄。union子句可以是查詢執(zhí)行的更快,尤其是當(dāng)其中一個查詢有一個優(yōu)化索引,而另一個查詢也有一個優(yōu)化索引的時候。
比如,在first_name和last_name上分別存在索引的情況下,執(zhí)行如下查詢語句:
mysql> select * from students where first_name like 'Ade%' or last_name like 'Ade%'
上述查詢和下面使用union合并兩條充分利用查詢語句的查詢相比,速度慢了許多。
mysql> select * from students where first_name like 'Ade%' union all select * from students wherelast_name like 'Ade%'
3. 避免使用帶有前導(dǎo)通配符的表達(dá)式
當(dāng)查詢中存在前導(dǎo)通配符時,Mysql無法使用索引。以上面的student表為例,如下的查詢會導(dǎo)致MySQL執(zhí)行全表掃描,及時first_name字段上加了索引。
mysql> select * from students where first_name like '%Ade'
使用explain分析得到如下結(jié)果:
| 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. 優(yōu)化數(shù)據(jù)庫架構(gòu)
1)規(guī)范化
首先,規(guī)范化所有數(shù)據(jù)庫表,即使可能會有些損失。比如,如果你需要創(chuàng)建兩張表分別用來記錄customers和orders數(shù)據(jù),你應(yīng)當(dāng)在order表上用顧客id引用顧客,而不是反過來。下圖顯示了沒有任何數(shù)據(jù)冗余而設(shè)計的數(shù)據(jù)庫架構(gòu)。
5.使用最佳數(shù)據(jù)類型
1)MySQL支持各種數(shù)據(jù)類型,包括integer,float,double,date,datetime,varchar,text等。當(dāng)設(shè)計數(shù)據(jù)庫表時,應(yīng)當(dāng)盡可能使用能夠滿足特性的最短的數(shù)據(jù)類型。
比如,如果你在設(shè)計一個系統(tǒng)用戶表,而該用戶數(shù)量不會超過100個人,你就應(yīng)該對user_ud使用'TINYINT'類型,該類型的取值范圍為-128至128。如果一個字段需要存儲date型值,使用datetime類型比較好,因為在查詢的時候無需進(jìn)行復(fù)雜的類型轉(zhuǎn)換。
當(dāng)值全為數(shù)字類型時,使用Integer。在進(jìn)行計算時,Integer類型的值比文本類型的值速度更快。
看完優(yōu)化MySQL有哪些技巧這篇文章,大家覺得怎么樣?如果想要了解更多相關(guān),可以繼續(xù)關(guān)注我們的行業(yè)資訊板塊。