線程三個基本狀態:就緒、執行、阻塞html
線程五個基本操做:建立、就緒、運行、阻塞、終止前端
進程四種形式:主從式、會話式、消息或郵箱機制、共享存儲區方式java
進程是具備必定功能的程序關於某次數據集合上的一次運行活動,是系統進行資源分配和調度的一個獨立單位。一個進程包含多個線程。mysql
線程是進程的一個實體,是CPU調度和分配的基本單元。nginx
四大域對象:PageContext、request、session、servletContextgit
九大內置對象:request、response、application、config、Exception、page、out、pageContext、sessionweb
Final關鍵詞修飾一個變量是指引用變量不能變。引用變量所指對象的內容是能夠變化的。ajax
private:
繼承成員但沒有訪問權限。(能夠經過此類中的protected成員函數和public成員函數訪問。)
protected:
繼承成員,有訪問權限,類外沒有訪問權限,不可將繼承的protected修改成private.
public:
繼承成員,有訪問權限,類外有訪問權限。redis
靜態代碼塊在JVM加載類的時候先執行,父類先於子類執行。算法
Before 在每一個測試方法以前都會運行一次,只須要聲明public
BeforeClass 在類中只運行一次,必須聲明成public static
public class Singleton {
private static Singleton sl;
private Singleton (){}
public static synchronized Singleton getInstance() {
if (sl== null) {
sl= new Singleton();
}
return sl;
}
}
String-字符串 Hash-字典 list-列表 set-集合 sorted set-有序集合
HashMap基於Map接口實現,線程非同步因此不安全。鍵是惟一不可重複的,可是value值能夠重複且容許空值存在。
HashTable是基於Dictionary類實現,線程默認同步因此是安全的,鍵值惟一且不爲空,value值不能爲空值。
HashSet是基於set實現的,以對象做爲元素,且拒絕重複對象。內部使用HashMap實現,其實就是HashMap的一個視圖。
ArrayList是基於動態數組的數據結構,查詢較快
LinkedList是基於鏈表的數據結構,由於不須要移動數據,因此增刪較快。
Wait方法屬於Object類,使線程放棄進入執行,進入線程等待池,只能使用notify或notifyAll方法才能喚醒此線程,線程會等待進入線程池。即便在執行此方法時,線程已進入線程池,依然會放棄執行,讓出線程池,交出鎖。即便線程被激活,也須要等待前方線程執行完畢後纔可進入線程池執行。
Sleep方法屬於Thread類,使線程在指定時間內暫停執行,讓cup暫時執行其餘線程,但這個線程的監控狀態依然保持,當執行時間到了之後,該線程恢復到以前狀態,繼續執行,線程不會釋放鎖。
==是一個運算符,是邏輯上的判斷,比較的是引用地址。
Equals是String的一個方法,是比較引用地址,在Object類時,Equals和==是同樣的,對於其餘類來講若是從新了Equals方法,則比較的兩個對象的數據內容。
HashCode和Equals都是在Object類中定義的,是對兩個對象地址的比較,若是重寫了Equals方法就必須重寫HashCode方法。
HashCode方法返回的是對象的散列碼,返回值是int類型的散列碼;Equals返回的是true和false。
若是兩個對象相同,他們的HashCode值必須相同;若是兩個對象的HashCode值相同,他們不同相同。
方法重載:在同一個類中,方法名稱相同,參數類型和個數不一樣,返回值也能夠不一樣。
方法重寫:父子類、接口和實現類之間的關係,子類能夠重寫父類方法,可是參數個數、類型、返回值必須相同。
Before是初始化方法,在每一個程序運行以前都會執行一次。
Beforeclass在類中只運行一次。
Situation: 事情是在什麼狀況下發生
Task: 你是如何明確你的任務的
Action: 針對這樣的狀況分析,你採用了什麼行動方式
Result: 結果怎樣,在這樣的狀況下你學習到了什麼
cookie數據存儲在客戶的瀏覽器上,cookie是不安全的,別人能夠分析存放在本地cookie並進行cookie欺騙;
Session存儲在服務器上,Session是安全的;當訪問增多時,Session會佔用服務器性能,能夠考慮使用cookie
建議將登錄信息等重要信息保存在Session中,其餘須要保留的信息能夠存在cookie中。
ID選擇器、類選擇器、層次選擇器、組合選擇器、屬性選擇器、表單選擇器等等
特性:原子性、一致性、隔離性、持久性。
隔離級別:
① Serializable (串行化):可避免髒讀、不可重複讀、幻讀的發生。
② Repeatable read (可重複讀):可避免髒讀、不可重複讀的發生。
③ Read committed (讀已提交):可避免髒讀的發生。
④ Read uncommitted (讀未提交):最低級別,任何狀況都沒法保證。
可分批處理 先行保存部份內容至數據庫,再清空list集合,從新導入內容
在一個字符集中,任何一個字符的編碼都不是另外一個字符編碼的前綴。
GC.run
消除線性隊列的「假溢出」,充分利用存儲空間。
WebService是一個平臺獨立的、低耦合的,自包含的、基於可編程的web應用程序,可以使用開放的xml標準來描述、發現、發佈、協調和配置這些應用程序,是用戶開發互操做的分佈式系統。最基本的目的就是提供在各個不一樣平臺的不一樣應用系統的系統工做能力。
1:Tomcat的Session複製。在一臺Tomcat的Session發生變化時,將變動的數據分發給其它的Tomcat服務器。
2: 採用 memcached session manager 共享session。
1:git是分佈式的版本控制系統,SVN不是。GIT和SVN都有本身的集中式版本庫或服務器,可是GIT更傾向分佈式使用。
2:GIT把內容按數據方式存儲,而SVN是按文件存儲的。
3:GIT能夠很容易的發現未被合併的分支,SVN須要手動運行命令來肯定代碼是否被合併。
4:GIT沒有一個全局的版本號,SVN有。但GIT內容完整性要優於SVN。
5:GIT在下載後即便在不聯網狀態也能夠看到全部數據,但SVN必需要聯網。
6:GIT的提交速度優於SVN,且GIT能夠有無限個版本庫,但SVN只有一箇中央數據庫,一旦這個中央庫有問題,則全部代碼都會所有癱瘓。
7:管理一個GIT庫相對於管理一個SVN庫更容易。
服務容器負責啓動,加載,運行服務提供者。
1. 服務提供者在啓動時,向註冊中心(默認端口2181)註冊本身提供的服務。
2. 服務消費者在啓動時,向註冊中心訂閱本身所需的服務。
3. 註冊中心返回服務提供者地址列表給消費者,若是有變動,註冊中心將基於長鏈接推送變動數據給消費者。
4. 服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,若是調用失敗,再選另外一臺調用。
5. 服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。
使用redis作緩存的緣由:
redis是用C語言編寫的,穩定性和性能更好。支持集羣模式和持久化等特性,不會應爲緩存量太多而致使虛擬機崩潰。Redis是獨立部署的,即便網站更新,redis緩存的數據也不會消失。
集羣搭建(redis須要3臺主機,3臺從機,則配置6臺,須要6個端口):
1:安裝ruby環境,上傳接口工程,安裝接口程序,拷貝腳本到指定位置
2:建立6個redis實例,修改配置文件 ,而後啓動全部redis實例(爲簡化啓動步驟,可編寫啓動腳本)。
3:執行建立集羣的命令,鏈接測試
Redis的事務是一組命令的集合,Redis事務的實現須要用到 MULTI 和 EXEC 兩個命令,事務開始的時候先向Redis服務器發送 MULTI 命令,而後依次發送須要在本次事務中處理的命令,最後再發送 EXEC 命令表示事務命令結束。
程序bug或人爲誤操做
· 因客戶端緩衝區內存使用過大,致使大量鍵被LRU淘汰
· 主庫故障後自動重啓,可能致使數據丟失
· 網絡分區的問題,可能致使短期的寫入數據丟失
· 主從複製數據不一致,發生故障切換後,出現數據丟失
· 大量過時鍵,同時被淘汰清理
做用:acitveMQ就是消息隊列,activemq安裝以後,會有一個broker(經紀人)。
消息的生產者將消息發送到broker中,它不關心誰消費該消息。
消息的消費者去broker中獲取信息,它不關心誰提供消息
$.ajax({
async:false // 爲false 時 爲同步, 默認 爲true , 爲異步
})
fastDFS有兩個角色:跟蹤器(tracker)和存儲節點(storage);
存儲數據:
跟蹤器負責記錄圖片地址,和響應java接口訪問。java接口要想儲存圖片地址需向跟蹤器發送請求,而後由跟蹤器查找圖片倉庫地址發給java接口,同時記錄儲存過程,
Java接口配IP是配2個的,由於有2個跟蹤器,而java接口鏈接IP時並非智能的,若是鏈接第一個跟蹤器沒反應(第一個沒反應不是忙就是掛了),它就會鏈接第二個跟蹤器,無論連哪一個跟蹤器,最終都會返回一個地址給java接口。而兩個跟蹤器之間是有通訊的,它們會把信息同步的,這個信息也就是meta信息,也就是管理的賬本。
跟蹤器和存儲節點有通訊間隔時間,這個時間由咱們決定。而存儲節點之間也是有通訊的,若是有一天存儲節點和存儲節點的倉庫都滿了,就擴張倉庫,建立下一組存儲節點和存儲倉庫。
取數據:
取數據的時候能夠用java接口取,也能夠用頁面裏的<img src=」http//…..jpg/>」取,可是src屬性會在頁面加載後發出2次請求。Src會根據地址去找跟蹤器,而跟蹤器會告訴它這地址圖片在哪一個存儲節點身上,跟蹤器這臺機器上搭建是nginx服務器(反向代理服務器)這個服務器是用來解決高併發用的。Nginx服務器會根據你的路徑找到存儲節點身上的圖片。而後再將存儲節點的圖片拿回來,再加載給src,到img標籤裏。
啓動:
先設置IP再修改IP,而後三個命令分別啓動跟蹤器,存儲節點,Nginx服務器
熱部署:就是maven管理的項目發佈到測試服務器,省去以往發佈時要不停的啓動、關閉tomcat這些繁瑣 的過程;熱:就是tomcat一直保持開啓狀態,
1、設置tomcat用戶名和密碼,而後啓動tomcat
2、在你所要發佈的項目裏的pom.xml裏設置你要發佈項目的路徑同時把tomcat用戶名和密碼也設置上
3、發送發佈命tomcat7:deploy
4、強硬發佈命令:tomcat7:redeploy
DEBUG Level: 指出細粒度信息事件對調試應用程序是很是有幫助的,就是輸出debug的信息.
INFO level: 代表消息在粗粒度級別上突出強調應用程序的運行過程,就是輸出提示信息.
WARN level: 代表會出現潛在錯誤的情形,就是顯示警告信息.
ERROR level: 指出雖然發生錯誤事件,但仍然不影響系統的繼續運行.就是顯示錯誤信息.
FATAL level: 指出每一個嚴重的錯誤事件將會致使應用程序的退出.
ALL level: 是最低等級的,用於打開全部日誌記錄.
OFF level: 是最高等級的,用於關閉全部日誌記錄.
自己不是爲高可用性設計,撐不住高流量容易致使系統崩潰。還有對網絡隔離的敏感也致使Zookeeper的脆弱
1) 繼承thread類 從新run函數 對象。start開啓
2) 實現runnnable接口 重寫run函數
3) 實現callable
1)接口是公開的,不能有私有方法和變量,可是抽象類能夠
2)實現一個接口必須實現接口的方法,抽象類能夠重寫也能夠不重寫
3)接口能夠實現多重繼承,抽象類只能實現多個接口
重寫是指子類繼承父類,重寫父類的方法。重載是多態的一種表現形式,是指在同一類中方法名相同參數列表不一樣的同命名方法。
匿名內部類也就是沒有名字的內部類
正由於沒有名字,因此匿名內部類只能使用一次,它一般用來簡化代碼編寫
但使用匿名內部類還有個前提條件:必須繼承一個父類或實現一個接口
1:經過@PathVariable獲取路徑中傳遞的參數 在方法參數前
2:經過@ModelAttribute獲取post請求中的form表單數據 在方法參數前
3:經過HttpServletRequest獲取
3:用@RequestParam
Web.xml:初始化spring容器 加載配置文件 contextConfigLocation
配置前端控制器 加載SpringMVC.Xml 設定startup爲1,啓動時加載 過濾全部請求
統一編碼方式 CharacterEncodingFilter 過濾全部請求
Spring.xml:配置包掃描器 context:component-scan
配置註解驅動 mvc:annotation-driven
配置視圖解析器 InternalResourceViewResolver <bean>
加載靜態資源 mvc:resources
配置多部件解析器 CommonsMultipartResolver 設定默認編碼和文件上傳的最大值
加載Java的其他配置文件 context:property-placeholder
SSH一般指Struts2作控制器,Spring管理各類組件,Hibernate負責持久化層。
SSM一般指SpringMVC作控制器,Spring管理各層組件,Mybatis負責持久化層。
相同點:1:Spring依賴注入來管理各層組件
2:使用面向切面的AOP編程思想管理事務、日誌、權限等。
不一樣點:Struts2和SpringMVC控制器控制視圖和交互機制不一樣。
1:SpringMVC開發效率高於Struts2,且SpringMVC以基本實現0配置。
2:SpringMVC實現依賴Servlet,是單例的,參數基於方法進行封裝。
3:SpringMVC是方法級別的攔截,一個方法對應一個request上下文,方法對應URL。方法之間的變量是不共享的,方法是獨立的,可使用註解方式接收參數。
4:Struts2是類級別的攔截,一個類對應一個request的上下文,配置文件較複雜,架構比較費時費力。雖然每一個方法之間也是獨立的,但全部類變量都是共享的,雖然不影響運行,可是編碼、讀程序卻比較麻煩。
5:Struts2實現依賴過濾器,是多例的,參數是基於屬性進行封裝。
6:Struts2須要封裝每個Request,把每一個生命週期變量封裝成一個個的MAP集合,並要保證線程的安全,比較耗費內存。
相同點:Hibernate和Mybatis都是經過SessionFactoryBuider由xml文件生成SessionFactory,而後生成Session,由Session開啓執行事務和SQL語句。其中SessionFactoryBuider,SessionFactory,Session的生命週期都是差很少的。都支持JDBC和JTA事務處理。
不一樣點:
Mybatis:Mybatis能夠進行更爲細緻的SQL優化,能夠減小查詢字段。
Mybatis相對於Hibernate更容易掌握,門欄較低。
Hibernate:Hibernate的DAO層開發比Mybatis更簡單,由於Mybatis須要維 護SQL和映射結果。
Hibernate對對象的維護和緩存要比MyBatis好,對增刪改查的對象的維護要方便。
Hibernate數據庫移植性很好,MyBatis的數據庫移植性很差,不一樣的數據庫須要寫不一樣SQL。
Hibernate有更好的二級緩存機制,可使用第三方緩存。MyBatis自己提供的緩存機制不佳。
Hibernate的一級緩存指的是Session緩存,由於Session緩存是內置的,是Hibernate的默認配置;二級緩存指的是SessionFactory的外置緩存,由於外置緩存是數據庫數據的拷貝,介質能夠是內存或硬盤,須要手動開啓。
Spring的事務管理分爲聲明式和編程式。聲明式事務可使用tx標籤方式、使用代理方式以及攔截器方式。編程式事務須要在配置中配置Session工廠,配置事務管理器,開啓註解掃描,使用@Service
@Controller @requestMapping @PathVariable @RequestParam@RequestBody @ResponseBody @RestController @ModelAttribute
1:數據庫設計時要下降關聯的複雜性,儘可能不使用聯合主鍵,適用冗餘數據,不過度追求高範式
2:使用延遲加載
Configuration,sessionfactory,Session,query接口,transaction接口
優勢:
方便解耦,簡化開發---Spring就是一個大工廠,能夠將全部對象建立和依賴關係維護,交給Spring管理
AOP編程的支持---Spring提供面向切面編程,能夠方便的實現對程序進行權限攔截、運行監控等功能
聲明式事務的支持---只須要經過配置就能夠完成對事務的管理,而無需手動編程
方便程序的測試---Spring對Junit4支持,能夠經過註解方便的測試Spring程序
方便集成各類優秀框架---Spring不排斥各類優秀的開源框架,其內部提供了對各類優秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持
下降JavaEE API的使用難度---Spring 對JavaEE開發中很是難用的一些API(JDBC、JavaMail、遠程調用等),都提供了封裝,使這些API應用難度大大下降
缺點:
jsp中要寫不少代碼、控制器過於靈活,缺乏一個公用控制器
工做機制:Spring的核心就是IOC和AOP因此Spring的工做機制簡單的理解也就是IOC和AOP的工做機制。
緣由:藉助於Spring AOP,Spring IOC可以很方便的使用到很是健壯、靈活的企業級服務,經過使用IoC可以下降組件之間的耦合度,最終,可以提升類的重用性,利於測試,並且更利於整個產品或系統集成和配置
Springmvc是spring一部分
IOC:控制反轉,生產對象用。控制權由應用代碼中轉到了外部容器,控制權的轉移,是所謂的反轉。
AOP:面向切面編程,底層使用動態代理,做用:管理事務和安全監控,事務 只須要配置一次就不用再配置。
Mvc是一個架構設計思想:
用戶發送請求至控制器(Controller),控制層把用戶請求轉發給模型Model層進行數據處理,Model層內包含javabean組件、領域模型、業務層、持久層,Model層處理完數據層響應給控制層,控制層再次把數據發送給視圖View進行視圖編譯,而後由View層把視圖頁面返回給控制層,控制層再響應給用戶。
返回給前端控制器
POJO是mybatis中的返回值的參數類型,它和bean同樣意思。Bean是指類,而POJO把類當作對象。Mybatis是在JDBC上作的封裝,爲了使SQL語句再也不是硬編碼和不用再按順序執行,爲了在框架裏獲取sql語句而設定的一種概念,獲得的是動態SQL。
實現過程:
在商品添加服務中發送商品ID消息,接收消息中的商品ID。
從spring上下文中獲取Freemarker的配置文件(configuration)對象。
經過configuration建立模板(template對象),模板的名稱在java配置文件中配置。
建立模板數據:根據商品ID查詢出商品信息,若是沒有數據,拋出異常。
指定輸出文本。文本的路徑在java配置文件中配置,文本的名稱是商品ID,文本的後綴在java配置文件中配置。
調用template的process方法,生成輸出文件。
能夠發送異步請求,使用Nginx訪問
臨時狀態(transient):剛用new語句建立,尚未被持久化,不處於Session的緩存中。處於臨時狀態的Java對象稱爲臨時對象。
持久化狀態(persistent):已經被持久化,加入到Session的緩存中。處於持久化狀態的Java對象稱爲持久化對象。
遊離狀態(detached):已經被持久化,但再也不處於Session的緩存中。處於遊離狀態的Java對象稱爲遊離對象。
Java對象:開始生命週期——》臨時狀態——》持久化狀態——》遊離狀態——》結束生命週期
1,實例化階段 調用init()方法
2,服務階段 調用service()方法
3,銷燬階段 調用destroy()方法
首先客戶發送一個請求,Servlet是調用service()方法對請求進行響應,經過源代碼可見,service()方法中對請求的方式進行了匹配,選擇調用doGet,doPost等這些方法,而後再進入對應的方法中調用邏輯層的方法,實現對客戶的響應。在Servlet接口和GenericServlet中是沒有doGet,doPost等等這些方法的,HttpServlet中定義了方法,可是都是返回error信息,因此,咱們每次定義一個Servlet的時候,都必須實現doPost,doGet等這些方法。
對象關係映射,也就是一種程序技術,用於實現面向對象編程語言裏不一樣類型系統的數據之間的轉換 。從效果上說,它實際上是建立了一個可在編程語言裏使用的--「虛擬對象數據庫」。
JVM是java的核心和基礎,在java編譯器和os平臺之間的虛擬處理器。它是一種基於下層的操做系統和硬件平臺並利用軟件方法來實現的抽象的計算機,能夠在上面執行java的字節碼程序。java編譯器只需面向JVM,生成JVM能理解的代碼或字節碼文件。Java源文件經編譯器,編譯成字節碼程序,經過JVM將每一條指令翻譯成不一樣平臺機器碼,經過特定平臺運行。
JVM執行程序的過程 :
I.加載.class文件
II.管理並分配內存
III.執行垃圾收集
JDBC(java數據庫鏈接)是一種用於執行SQL語句的Java API,能夠爲多種關係數據庫提供統一訪問,它由一組用Java語言編寫的類和接口組成。JDBC提供了一種基準,據此能夠構建更高級的工具和接口,使數據庫開發人員可以編寫數據庫應用程序,同時,JDBC也是個商標名。
1、客戶端瀏覽器發出HTTP請求.
2、根據web.xml配置,該請求被FilterDispatcher接收
3、根據struts.xml配置,找到須要調用的Action類和方法, 並經過IoC方式,將值注入給Aciton
4、Action調用業務邏輯組件處理業務邏輯,這一步包含表單驗證。
5、Action執行完畢,根據struts.xml中的配置找到對應的返回結果result,並跳轉到相應頁面
6、返回HTTP響應到客戶端瀏覽器
原理:
1 客戶端初始化一個指向Servlet容器(例如Tomcat)的請求
2 這個請求通過一系列的過濾器(Filter)(這些過濾器中有一個叫作ActionContextCleanUp的可選過濾器,這個過濾器對於Struts2和其餘框架的集成頗有幫助,例如:SiteMesh Plugin)
3 接着FilterDispatcher被調用,FilterDispatcher詢問ActionMapper來決定這個請是否須要調用某個Action
4 若是ActionMapper決定須要調用某個Action,FilterDispatcher把請求的處理交給ActionProxy
5 ActionProxy經過Configuration Manager詢問框架的配置文件,找到須要調用的Action類
6 ActionProxy建立一個ActionInvocation的實例。
7 ActionInvocation實例使用命名模式來調用,在調用Action的過程先後,涉及到相關攔截器(Intercepter)的調用。
8 一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。返回結果一般是(但不老是,也可 能是另外的一個Action鏈)一個須要被表示的JSP或者FreeMarker的模版。在表示的過程當中可使用Struts2 框架中繼承的標籤。在這個過程當中須要涉及到ActionMapper
1:表的設計要符合三範式。
2:添加適當存儲過程,觸發器,事務等。
3:添加適當的索引,索引對查詢速度影響很大,必須添加索引。主鍵索引,惟一索引,普通索引,全文索引
4:讀寫分離(主從數據庫,主數據庫進行寫的操做,從數據庫驚醒讀的操做,主數據庫將數據更新到從數據庫)
5:對sql語句的一些優化,(查詢執行速度比較慢的sql語句)
a:查詢中避免使用通配符,儘可能使用索引。選擇聯合查詢的聯合次序
b:在子查詢中避免使用in 或 not in 語句,使用where (NOT) exists的效果要好的多;避免使用BY RAND隨機顯示結果。
c:使用聯合(UNION)代替手動建立的臨時表,拆分表格。
d:儘量的使用NOT NULL(非空),對MySQL的配置進行優化
6:分表分區
分表:把一張大表分紅多張表。分區:把一張表裏面的分配到不一樣的區域存儲,
對mysql服務器硬件的升級操做。
alter table ~ add ~ 添加列
mysql的最大鏈接數默認是100, 最大能夠達到16384
limit關鍵字:LIMIT 能夠被用於強制 SELECT 語句返回指定的記錄數。LIMIT 接受一個或兩個數字參數。參數必須是一個整數常量。若是給定兩個參數,第一個參數指定第一個返回記錄行的偏移量,第二個參數指定返回記錄行的最大數目。初始記錄行的偏移量是 0(而不是 1)
優勢:經過建立惟一性索引,能夠保證數據庫中每一行數據的惟一性,2,能夠大大加快數據的檢索速度,這也是建立索引的最主要的緣由,3.能夠加速表與表之間的鏈接,特別是在實現數據的參考完整性。
缺點:建立索引和維護索引須要消耗時間,這種時間隨着數據的增長而增長,2.索引佔用物理空間,須要的空間變大,3.當對數據庫中的數據進行增刪改的時候,索引也須要動態的維護,此時下降了維護速度。
集合去重:
a:轉化爲Set集合,由於HashSet集合不容許重複值存在。
b:使用雙重循環刪除重複的值或者用null代替
c:用contains方法
數據庫去重:
a:使用嵌套的查詢 獲得全部的不重複數據的Id,使用 not in 關鍵字刪除全部ID不在以上範圍中的數據。
b:使用嵌套的查詢 獲得全部的不重複數據的Id,將全部數據存儲到一個臨時表中,刪除原表,從新構建原表,將臨時表數據導入原表,刪除臨時表
普通索引:添加index
Alter table user add index_name(name),括號內爲字段名稱
主鍵索引
Alert table user add primary key(id)
惟一索引:添加unique
Alert table user add unique (creattime)
全文索引:添加fulltext
Alert table user add fulltext(name)
Mysql存儲過程就是爲完成特定功能的SQL語句集,通過編譯以後存儲在數據庫中,當須要使用該組SQL語句時,用戶只須要經過指定存儲過程的名字並給定參數就能夠調用。
存儲過程是一個可編程的函數,在數據庫中建立並保存。能夠有SQL語句和一些特殊的控制結構組成。能夠看作是對編程中面向對象的模擬。
1. Oracle是大型數據庫而Mysql是中小型數據庫,Oracle市場佔有率達40%,Mysql只有20%左右,同時Mysql是開源免費的而Oracle價格很是高。
2. Oracle支持大併發,大訪問量,是OLTP最好的工具。
3. 安裝所用的空間差異也是很大的,Mysql安裝完後才152M而Oracle有3G左右,且使用的時候Oracle佔用特別大的內存空間和其餘機器性能。
4.Oracle也Mysql操做上的一些區別
①主鍵 Mysql通常使用自動增加類型,在建立表時只要指定表的主鍵爲auto increment,插入記錄時,不須要再指定該記錄的主鍵值,Mysql將自動增加;Oracle沒有自動增加類型,主鍵通常使用的序列,插入記錄時將序列號的下一個值付給該字段便可;只是ORM框架是隻要是native主鍵生成策略便可。
②單引號的處理 MYSQL裏能夠用雙引號包起字符串,ORACLE裏只能夠用單引號包起字符串。在插入和修改字符串前必須作單引號的替換:把全部出現的一個單引號替換成兩個單引號。
③翻頁的SQL語句的處理 MYSQL處理翻頁的SQL語句比較簡單,用LIMIT 開始位置, 記錄個數;ORACLE處理翻頁的SQL語句就比較繁瑣了。每一個結果集只有一個ROWNUM字段標明它的位置, 而且只能用ROWNUM<100, 不能用ROWNUM>80
④ 長字符串的處理 長字符串的處理ORACLE也有它特殊的地方。INSERT和UPDATE時最大可操做的字符串長度小於等於4000個單字節, 若是要插入更長的字符串, 請考慮字段用CLOB類型,方法借用ORACLE裏自帶的DBMS_LOB程序包。插入修改記錄前必定要作進行非空和長度判斷,不能爲空的字段值和超出長度字段值都應該提出警告,返回上次操做。 ⑤空字符的處理 MYSQL的非空字段也有空的內容,ORACLE裏定義了非空字段就不允許有空的內容。按MYSQL的NOT NULL來定義ORACLE表結構, 導數據的時候會產生錯誤。所以導數據時要對空字符進行判斷,若是爲NULL或空字符,須要把它改爲一個空格的字符串。
⑥字符串的模糊比較 MYSQL裏用 字段名 like '%字符串%',ORACLE裏也能夠用 字段名 like '%字符串%' 但這種方法不能使用索引, 速度不快。
⑦Oracle實現了ANSII SQL中大部分功能,如,事務的隔離級別、傳播特性等而Mysql在這方面仍是比較的若