1. gzyueqian
      13352868059

      對(duì)于一個(gè)想學(xué)習(xí)java的新手來(lái)說(shuō)應(yīng)該怎么學(xué)習(xí)java編程

      更新時(shí)間: 2018-10-03 12:00:00來(lái)源: java編程瀏覽量:3881

          作為一個(gè)程序員,不僅要熟練使用sql語(yǔ)句,更應(yīng)該使用高效的sql語(yǔ)句。
          本篇blog講解的內(nèi)容主要包括:
          索引的使用。
          執(zhí)行計(jì)劃分析。
          sql優(yōu)化常見(jiàn)案例分析。
          ##索引
          一,什么是索引
          索引的作用只有一個(gè),提高查找效率。
          如下面sql語(yǔ)句:
          select name from person where age = 16;
          在正常情況下,MySql是從條數(shù)依次遍歷,直到讀完整個(gè)表才能得到所有age等于16的數(shù)據(jù)。
          如果對(duì)age字段建立索引,MySql會(huì)維護(hù)一個(gè)索引表,索引表中存儲(chǔ)不同age與數(shù)據(jù)對(duì)對(duì)應(yīng)關(guān)系,當(dāng)查找age等于16的數(shù)據(jù)時(shí)會(huì)先在索引表中找到age等于16對(duì)應(yīng)的數(shù)據(jù)id,然后直接根據(jù)數(shù)據(jù)id從數(shù)據(jù)表中需要的數(shù)據(jù)。這就類(lèi)似于新華字典中的拼音查字法,先從拼音序列中找出這個(gè)字在哪一頁(yè),然后直接去那一頁(yè)去找,避免翻遍整個(gè)字典,很大的提供了查找效率。
          二,索引的利弊分析
          上面說(shuō)到創(chuàng)建索引會(huì)很大的提高查找效率,但索引也有弊端。
          創(chuàng)建索引系統(tǒng)會(huì)自動(dòng)維護(hù)一個(gè)索引表,每當(dāng)數(shù)據(jù)增加,更新,刪除時(shí)都需要更改索引表,所以創(chuàng)建索引會(huì)降低增加,更新,刪除的效率。
          三,創(chuàng)建索引的原則
          創(chuàng)建索引針對(duì)的對(duì)象是字段,所以我們要找出適合創(chuàng)建索引的字段。
          建議創(chuàng)建索引的列:
          定義主鍵的數(shù)據(jù)列一定要建立索引。
          定義有外鍵的數(shù)據(jù)列一定要建立索引。
          對(duì)于經(jīng)常查詢(xún)的數(shù)據(jù)列建立索引。
          對(duì)于需要在指定范圍內(nèi)的快速或頻繁查詢(xún)的數(shù)據(jù)列創(chuàng)建索引;
          經(jīng)常用在WHERE句中的數(shù)據(jù)列創(chuàng)建索引。
          經(jīng)常出現(xiàn)在關(guān)鍵字order by、group by、distinct后面的字段,建立索引。如果建立的是復(fù)合索引,索引的字段順序要和這些關(guān)鍵字后面的字段順序一致,否則索引不會(huì)被使用。
          不建議創(chuàng)建索引的列:
          對(duì)于那些查詢(xún)中很少涉及的列,重復(fù)值比較多的列不要建立索引。
          對(duì)于定義為text、image和bit的數(shù)據(jù)類(lèi)型的列不要建立索引。
          對(duì)于經(jīng)常存取的列避免建立索引?
          限制表上的索引數(shù)目。對(duì)一個(gè)存在大量更新操作的表,所建索引的數(shù)目一般不要超過(guò)3個(gè),多不要超過(guò)5個(gè)。索引雖說(shuō)提高了訪(fǎng)問(wèn)速度,但太多索引會(huì)影響數(shù)據(jù)的更新操作。
          對(duì)復(fù)合索引,按照字段在查詢(xún)條件中出現(xiàn)的頻度建立索引。在復(fù)合索引中,記錄首先按照個(gè)字段排序。對(duì)于在個(gè)字段上取值相同的記錄,系統(tǒng)再按照第二個(gè)字段的取值排序,以此類(lèi)推。因此只有復(fù)合索引的個(gè)字段出現(xiàn)在查詢(xún)條件中,該索引才可能被使用,因此將應(yīng)用頻度高的字段,放置在復(fù)合索引的前面,會(huì)使系統(tǒng)可能地使用此索引,發(fā)揮索引的作用。
          注:具體怎么哪些列可以創(chuàng)建索引,哪些列不建議創(chuàng)建索引,需要具體情況具體分析,需要開(kāi)發(fā)中慢慢積累經(jīng)驗(yàn)。
          四,創(chuàng)建索引
          索引分為單索引和組合索引。但索引是給一個(gè)字段創(chuàng)建的索引,組合索引是給多個(gè)字段創(chuàng)建的索引。
          比如給person表中的age字段創(chuàng)建索引的sql是:
          ALTER TABLE `xia`.`person` ADD INDEX(`age`) USING BTREE COMMENT '給age創(chuàng)建索引';
          navicate也支持創(chuàng)建索引的圖形化操作,如下:
          ##執(zhí)行計(jì)劃
          執(zhí)行計(jì)劃就是分析執(zhí)行某個(gè)sql語(yǔ)句的詳細(xì)細(xì)節(jié)。
          查看某個(gè)sql語(yǔ)句的執(zhí)行計(jì)劃很容易,只有在sql語(yǔ)句前添加EXPLAIN關(guān)鍵詞即可。如下:
          EXPLAIN select  * from person WHERE age = 16 and id > 0;
          執(zhí)行結(jié)果如下:
          說(shuō)明:
          type:表示執(zhí)行sql使用了哪種類(lèi)型。類(lèi)型的種類(lèi)從好到差依次是:const、eq_reg、ref、range、indexhe和ALL。
          possible_keys:可能使用到的索引。此時(shí)有兩個(gè):PRIMARY,index_age。其中PRIMARY是主鍵,index_age是自己創(chuàng)建的索引。
          key:實(shí)際用到的索引。
          key_len:使用索引的長(zhǎng)度,該值越小越好。
          ref:
          rows:數(shù)據(jù)遍歷的行數(shù),數(shù)值越小越好。
          總結(jié):要學(xué)會(huì)且有意識(shí)的多使用執(zhí)行計(jì)劃,查看每一個(gè)sql語(yǔ)句的執(zhí)行計(jì)劃,盡量?jī)?yōu)化sql,提高項(xiàng)目的執(zhí)行效率。
          ##sql優(yōu)化具體分析
          sql優(yōu)化主要針對(duì)查詢(xún)sql進(jìn)行優(yōu)化,因?yàn)橹挥胁樵?xún)語(yǔ)句才會(huì)出現(xiàn)掃描全表的情況。隨著數(shù)據(jù)量的增大,掃描全表會(huì)非常耗時(shí),優(yōu)化sql的目的是盡量掃描少的數(shù)據(jù)量。
          具體細(xì)節(jié)如下:
          1,盡量給字段設(shè)置默認(rèn)值,避免字段值為null情況。
          如果字段是int類(lèi)型的age,首先給age創(chuàng)建索引時(shí)null不會(huì)參與創(chuàng)建索引。where age=0比where age is null效率高。
          2,在where語(yǔ)句中少使用or,使用or將不使用索引。
          如select name where age = 16 or age = 20
          可以寫(xiě)成:
          select name where age = 16 union all?select name where age = 20
          3,在where語(yǔ)句中避免使用in,
          如select * from score where student_id in (select id from student where name='guoxiang')
          可以寫(xiě)成:

          select * from score sc? where exists?(select 1 from student st? where st.name='guoxiang' and st.id = sc.student_id)

          想要了解更多的java應(yīng)用技術(shù)那就加入我們吧!

      免費(fèi)預(yù)約試聽(tīng)課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 中文乱码在线波多野结衣 | 亚洲欧洲日本无在线码不卡 | 日本一区不卡高清更新区 | 精品国产精品人成电影 | 在线观看网站深夜免费AV | 曰本久久免费精品 |