内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

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

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

在承德縣等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒ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è),成都營銷網(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ù)庫中獲取結(jié)果。索引在排序中的作用也非常大。

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

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

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

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

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

型號,Mysql提供了一個(gè)特別的Explain語句,用來分析你的查詢語句的性能。當(dāng)你將查詢語句添加到該關(guān)鍵詞后面時(shí),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í)行一個(gè)全表掃描,因?yàn)閗ey列為Null。其次,MySql云服務(wù)器已經(jīng)明確表示它將要掃描500行的數(shù)據(jù)來完成這次查詢。

為了優(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

如果我們再次執(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  |
+----+-------------+-----------+------------+------+---------------+-------------+---------+-------+------+----------+-------+

從上述的輸出結(jié)果,顯然MySQL云服務(wù)器會使用索引customer_id來查詢表格??梢钥葱枰獟呙璧男袛?shù)為1。雖然我只是在一個(gè)行數(shù)為500的表格中執(zhí)行這條查詢語句,索引在檢索一個(gè)更大的數(shù)據(jù)集的時(shí)候優(yōu)化程度更加明顯。

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

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

比如,在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 where last_name like 'Ade%'

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

當(dāng)查詢中存在前導(dǎo)通配符時(shí),Mysql無法使用索引。以上面的student表為例,如下的查詢會導(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ù)庫的性能,你應(yīng)當(dāng)考慮使用MySQL的全文檢索(FTS),因?yàn)樗韧ㄅ浞樵兛斓枚唷3艘酝?,F(xiàn)TS還能夠返回質(zhì)量更好的相關(guān)結(jié)果。

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

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

在上面的例子中,我們針對搜索關(guān)鍵字Ade指定了想要匹配的列(first_name, last_name)。如果查詢優(yōu)化器如上語句的執(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ù)庫架構(gòu)

規(guī)范化

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

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

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

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

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

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

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

避免NULL

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

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

網(wǎng)頁題目:優(yōu)化MYSQL查詢的詳細(xì)方法
分享URL:http://www.rwnh.cn/article32/pgcssc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、品牌網(wǎng)站制作、小程序開發(fā)、響應(yīng)式網(wǎng)站、建站公司、企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
工布江达县| 娱乐| 集安市| 高阳县| 凉城县| 浦城县| 莆田市| 全椒县| 安阳市| 临汾市| 镇雄县| 曲松县| 芷江| 琼结县| 阿拉善左旗| 象州县| 如皋市| 台州市| 镇安县| 咸阳市| 瑞昌市| 苏尼特左旗| 固始县| 仁布县| 全南县| 固镇县| 余姚市| 景泰县| 娄烦县| 阿克陶县| 井陉县| 宁阳县| 德钦县| 沙坪坝区| 左权县| 玉溪市| 大竹县| 吉水县| 两当县| 淄博市| 会昌县|