日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

MariaDB(MySQL)数据库的介绍及使用示例

發(fā)布時(shí)間:2025/3/18 数据库 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MariaDB(MySQL)数据库的介绍及使用示例 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

MySQL or MariaDB:

層次模型 --> 網(wǎng)狀模型 --> (IBM Codd)關(guān)系模型 --> No-SQL關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS):范式:第一范式,第二范式,第三范式;表:二維表;Row:Record,記錄;Column:Field,字段;描述每個(gè)記錄的特定屬性;任何一張RDBMS的表中,可以沒有任何Row,但至少應(yīng)該有一個(gè)Column;對(duì)表的操作:關(guān)系運(yùn)算:選擇:從指定的表中檢索符合條件的行;SELECT * FROM tbl_name WHERE clause;投影:從指定的表中檢索符合條件的列;SELECT column1,column2,column3 as column3_alias FROM tbl_name;注意:可以同時(shí)實(shí)現(xiàn)選擇和投影的關(guān)系運(yùn)算操作;SELECT column1,column2,column3 as column3_alias FROM tbl_name WHERE clause;數(shù)據(jù)庫(kù):表,索引,視圖(虛表),SQL_interface,存儲(chǔ)過程,存儲(chǔ)函數(shù),觸發(fā)器,事件調(diào)度器;DDLDML約束:主鍵約束:數(shù)據(jù)唯一且不能為空,每張表只能有一個(gè)主鍵;唯一鍵約束:數(shù)據(jù)唯一,可以為空,每張表中不限制唯一鍵的數(shù)量;外鍵約束:引用性約束或參考性約束;即:如果某表中頻繁出現(xiàn)冗余信息,應(yīng)該將此類信息存儲(chǔ)于其他的表中,而此表中該字段的數(shù)據(jù)為另一張表的主鍵中所包含的值;檢查性約束:表達(dá)式約束;DBMS的三層模型:視圖層;面向最終用戶;邏輯層;面向程序員或DBA;物理層;面向系統(tǒng)管理員;RDBMS的應(yīng)用實(shí)現(xiàn):商業(yè)版:Oracle,DB2,Sybase,Infomix,SQL Server,MySQL;開源版:MySQL Community Server,MariaDB,PostgreSQL,SQLlite;MySQL/MariaDB:MySQL:5.1 --> 5.5 --> 5.6 --> 5.7 --> 8.0 --> 8.0.11 (mysql shell, mysqlsh)MariaDB:5.5.x --> 10.x特性:插件式的存儲(chǔ)引擎:存儲(chǔ)引擎于MySQL/MariaDB而言,也被稱為"表類型";MyISAM,InnoDB,XtraDB(InnoDB),Aria,BlackHole,...單進(jìn)程多線程;在Linux(CentOS)中安裝MySQL/MariaDB的方式:1.rpm包:OS VendorThird Side官方;2.Binary Package:OS:Linux、windowsArch:i686,x86_64,ppc,...Glibc:msyql-linux-glibc214Init/Systemd:Systemd3.SourceCode Package:mysql/mariadb-Version.tar.gzcmake配置文件:位于不同位置的多個(gè)配置文件,通常按照一定的順序來讀取其中的配置參數(shù):Default options are read from the following files in the given order:/etc/mysql/my.cnf /etc/my.cnf /etc/my.cnf.d ~/.my.cnf已經(jīng)被指定順序的配置中如果出現(xiàn)同一配置參數(shù)且具有不同的值,最后讀取的文件中的參數(shù)值將成為最終生效的參數(shù)值;在使用mysqld_safe命令啟動(dòng)mysqld服務(wù)進(jìn)程時(shí),可以通過一些選項(xiàng)來更改或附加配置文件的讀取順序;-c, --defaults-file=name Like --config-file, except: if first option, then readthis file only, do not read global or per-user configfiles; should be the first option如果在命令行中給出此選項(xiàng),則此選項(xiàng)必須是第一個(gè)選項(xiàng),此時(shí),僅從此選項(xiàng)指定的配置文件中讀取參數(shù)值,不會(huì)再讀取任何其他的配置文件,包括全局的和個(gè)人的;-e, --defaults-extra-file=name Read this file after the global config file and beforethe config file in the users home directory; should bethe first option如果在命令行中給出此選項(xiàng),則此選項(xiàng)必須是第一個(gè)選項(xiàng),此時(shí),將所有其他的配置文件按照指定順序讀取完成之后,最后再附加讀取此選項(xiàng)指定的配置文件中參數(shù)值配置,只要有參數(shù)配置沖突,則必然以此選項(xiàng)指定的文件中的參數(shù)中為最終生效的參數(shù)值;配置文件的風(fēng)格:ini風(fēng)格的配置文件;即:分段式配置文件;為MySQL的各應(yīng)用程序提供與之對(duì)應(yīng)的配置參數(shù)信息:服務(wù)器端應(yīng)用程序:[server]socket=datadir=basedir=[mysqld]socket=[mysqld_safe]socket=[mysqld_multi]客戶端應(yīng)用程序:[client]user=password=host=[mysql]user=password=host=[mysqladmin][mysqldump]配置文件中各參數(shù)的定義方法:PARAMETER_NAME = VALUEPARAMETER_NAME=VALUEPARAMETER_NAMEinnodb_file_per_table = ONinnodb-file-per-table = ONdefaults-file=/tmp/my.cnfdefaults_file=/tmp/my.cnfskip_name_resolve=ONskip_name_resolve程序環(huán)境:程序文件:服務(wù)器端程序:mysqld_safe、mysqld_multi客戶端程序:msyql、mysqladmin、mysqldump、...服務(wù)器端輔助管理工具程序:myisam*、my_print_defaults、mysql_secure_installation、mysql_install_db、...mysql:交互式命令行工具和非交互式命令行工具;-u, -h, -p, -P, -D, -S, -e交互式模式:客戶端命令:?(\?,\h), \c, \d, \g, \G, \q, \., \!, \s, \u, ... 服務(wù)器端命令:SQL語句,需要使用語句結(jié)束符;help COMMANDDDL:CREATE、DROP、ALTER、SHOW;DML:SELECT、INSERT、UPDATE、DELETE;DCL:GRANT、REVOKE;mysql命令支持mysql腳本的執(zhí)行:mysql [options] [DB_NAME] < /PATH/TO/SOME_SQL_SCRIPT_FILE mysqladmin命令:mysqladmin - client for administering a MySQL server常用選項(xiàng):-u, -h, -p, -P, -D, -S各選項(xiàng)功能同mysql命令的選項(xiàng)功能;常用子命令:create db_name:創(chuàng)建數(shù)據(jù)庫(kù);drop db_name:刪除數(shù)據(jù)庫(kù);flush-hosts:清除服務(wù)器緩存中所有信息;flush-logs:清除日志,讓日志滾動(dòng);flush-privileges:刷新授權(quán)表;flush-tables:為表加鎖;password new-password:為指定的用戶設(shè)置新密碼;start-slave:在msyql的集群服務(wù)中的從節(jié)點(diǎn)啟動(dòng)用于實(shí)施復(fù)制功能的線程;stop-slave:在msyql的集群服務(wù)中的從節(jié)點(diǎn)關(guān)閉用于實(shí)施復(fù)制功能的線程;shutdown:停止服務(wù);mysqld_safe命令:用于啟動(dòng)mysql服務(wù),定義mysql的工作特性;格式:/usr/bin/mysqld_safe [OPTIONS]注意:所有給出的 OPTION(--option)都是一次性生效;如果期望配置參數(shù)永久有效,需要將此類配置參數(shù)及參數(shù)值直接定義在配置文件中即可;服務(wù)器運(yùn)行時(shí)變量/服務(wù)器運(yùn)行時(shí)參數(shù):MySQL的運(yùn)行工作特性;這里特性有兩種:1.全局特性:在全局范圍均有效的服務(wù)器參數(shù)所配置定義的工作特性;將會(huì)作為每個(gè)mysql的會(huì)話連接的默認(rèn)特性參數(shù);2.會(huì)話特性:僅針對(duì)于本次mysql的連接會(huì)話生效的特性參數(shù);查看已經(jīng)生效的mysql運(yùn)行參數(shù)(特性,變量)SHOW [GLOBAL | SESSION] VARIABLES [like_or_where]示例:show [global] variables like '%innodb%';查看所有名字中包含innodb字樣的服務(wù)器參數(shù)及參數(shù)值;可以一次顯示多個(gè);show [global] variables like 'innodb_file_per_table';僅查看指定名稱的服務(wù)器參數(shù)的參數(shù)值;select @@[global.]innodb_file_per_table;僅查看指定名稱的服務(wù)器參數(shù)的參數(shù)值;服務(wù)器狀態(tài)參數(shù)/服務(wù)器狀態(tài)變量:MySQL工作時(shí)的統(tǒng)計(jì)信息;有兩種狀態(tài)參數(shù):1.全局2.會(huì)話查看與狀態(tài)及統(tǒng)計(jì)信息相關(guān)的參數(shù)/變量的值;SHOW [GLOBAL | SESSION] STATUS [like_or_where]示例:show [global] status like '%innodb%';查看所有名字中包含innodb字樣的服務(wù)器狀態(tài)參數(shù)及其值;可以一次顯示多個(gè);show [global] staus like 'Com_select';僅查看指定名稱的服務(wù)器狀態(tài)參數(shù)的值;服務(wù)器變量/服務(wù)器參數(shù)的修改或調(diào)整方法:1.運(yùn)行時(shí)修改:MariaDB [(none)]> SET [GLOBAL|SESSION] system_var_name = expr;MariaDB [(none)]> SET @@[GLOBAL.|SESSION.]system_var_name = expr;示例:set global innodb_file_per_table=1;set @@global.innodb_file_per_table=0;2.永久修改:通過在配置文件中直接書寫服務(wù)器參數(shù)或變量的賦值語句;重啟服務(wù)即可生效;innodb_file_per_table = ONmysql_secure_installation:安全初始化腳本;

SQL:結(jié)構(gòu)化查詢語言;
ANSI:美國(guó)國(guó)家標(biāo)準(zhǔn)委員會(huì);
SQL-86,SQL-89,SQL-92,SQL-99,SQL-03

SQL-MODE:MariaDB/MySQL:ANSI:寬松模式。對(duì)于插入的數(shù)據(jù)進(jìn)行校驗(yàn),如果該數(shù)據(jù)不符合字段定義的數(shù)據(jù)類型或長(zhǎng)度要求,則對(duì)數(shù)據(jù)類型進(jìn)行調(diào)整,也可以對(duì)數(shù)據(jù)進(jìn)行截取保存,發(fā)送warning警告;TRADITIONAL:嚴(yán)格模式。對(duì)于插入的數(shù)據(jù)進(jìn)行校驗(yàn),如果該數(shù)據(jù)不符合字段定義的數(shù)據(jù)類型或長(zhǎng)度要求,報(bào)告Error錯(cuò)誤警告,且錯(cuò)誤數(shù)據(jù)不會(huì)被寫入;該模式用于事務(wù)時(shí),此前可能已經(jīng)進(jìn)行了一系列的數(shù)據(jù)插入和修改操作,而一旦發(fā)送上述錯(cuò)誤,此前所有的INSERT/UPDATE等操作均會(huì)被立即放棄并回滾。該模式用于非事務(wù)時(shí),一旦發(fā)送上述錯(cuò)誤,則此前所有的INSERT/UPDATE等操作均不會(huì)回滾STRICT_TRANS_TABLES:嚴(yán)格模式。對(duì)于插入的數(shù)據(jù)進(jìn)行校驗(yàn),如果該數(shù)據(jù)不符合字段定義的數(shù)據(jù)類型或長(zhǎng)度要求,報(bào)告Error錯(cuò)誤警告,且錯(cuò)誤數(shù)據(jù)不會(huì)被寫入;STRICT_ALL_TABLES:嚴(yán)格模式。對(duì)于事務(wù)型操作,與STRICT_TRANS_TABLES模式效果一樣;對(duì)于非事務(wù)操作,與TRADITIONAL模式效果一樣。實(shí)時(shí)修改sql_mode:MariaDB [(none)]> set @@global.sql_mode=TRADITIONAL;注意:1.沒有最好或最差的模式,只有最合適的模式;2.使用上述SQL命令只能一次性生效,如果想要永久修改,則需要編輯配置文件;MySQL的數(shù)據(jù)類型:字符型:CHAR(#),BINARY(#):定長(zhǎng)字符類型;CHAR類型不區(qū)分字符大小寫,BINARY類型區(qū)分;VARCHAR(#),VARBINARY(#):變長(zhǎng)字符類型;TEXT:TINYTEXT,TEXT,MEDIUMTEXT,LONGTEXT;BLOB:TINYBLOB,BLOB,MEDIUMBLOB,LONGBLOB;數(shù)值型:浮點(diǎn)型:近似值;單精度雙精度REALBIT整型:精確值;INTEGER:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT;BOOLEANDICIMALOCTALHEXIMAL日期時(shí)間型:日期型:DATE 2018/07/19時(shí)間型:TIME 9:38:42日期時(shí)間型:DATETIME 2018/07/19 9:38:42時(shí)間戳:TIMESTAMP,數(shù)值型的整型;內(nèi)建類型:ENUM:枚舉;SET:集合;數(shù)據(jù)類型的修飾符:字符型:NULL, NOT NULL, DEFAULT 'STRING',CHARACTER SET 'CHARSET', COLLATION "COLLATION";整型:NULL, NOT NULL, DEFAULT 'VALUE', AUTO_INCREMENT, UNSIGNED;日期時(shí)間型:NULL, NOT NULL, DEFAULT 'DATE/TIME/DATETIME'

SQL:
DDL:數(shù)據(jù)庫(kù)對(duì)象;
獲取DDL相關(guān)SQL語句的方法:
MariaDB [testdb]> help data definition

數(shù)據(jù)庫(kù)對(duì)象:DATABASE, TABLE, VIEW, FUNCTION, PRECEDURE, INDEX, ...DML:數(shù)據(jù);獲取DML相關(guān)SQL語句的方法:MariaDB [testdb]> help data manipulation數(shù)據(jù)操縱:INSERT/REPLACE, DELETE, UPDATE, SELECT, ...

DDL:
數(shù)據(jù)庫(kù):
創(chuàng)建數(shù)據(jù)庫(kù):
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [DEFAULT] [CHARACTER SET [=] charset_name | [DEFAULT] COLLATE [=] collation_name]

修改數(shù)據(jù)庫(kù)的字符集或排序規(guī)則:ALTER {DATABASE | SCHEMA} [db_name] [DEFAULT] [CHARACTER SET [=] charset_name | [DEFAULT] COLLATE [=] collation_name]刪除數(shù)據(jù)庫(kù):DROP {DATABASE | SCHEMA} [IF EXISTS] db_name使用客戶端命令創(chuàng)建數(shù)據(jù)庫(kù):~]# mysqladmin create mydb~]# mysql -e "create database mydb;"使用客戶端命令刪除數(shù)據(jù)庫(kù):~]# mysqladmin drop mydb //會(huì)對(duì)刪除數(shù)據(jù)庫(kù)的操作進(jìn)行確認(rèn);~]# mysql -e "drop database mydb;"表:創(chuàng)建表:CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name(create_definition,...)[table_options][partition_options]//使用SQL語句全新的定義出一張新表,包括表的名稱、字段數(shù)量、數(shù)據(jù)類型、存儲(chǔ)引擎的選擇等各種屬性;Or:CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name[(create_definition,...)][table_options][partition_options]select_statement//利用SELECT語句的查詢結(jié)果來填充新表的內(nèi)容,但是新表的表格式可能與基表不一致,很多的數(shù)據(jù)類型的修飾符可能會(huì)丟失;Or:CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name{ LIKE old_tbl_name | (LIKE old_tbl_name) }//直接復(fù)制基本的表格式到新表上,但新表中沒有任何數(shù)據(jù),即為空表;注意:1.對(duì)于MySQL或MariaDB的表來說,存儲(chǔ)引擎是非常重要的概念,通常需要在創(chuàng)建表的時(shí)候來指定;如果沒有明確指定,則使用默認(rèn)的存儲(chǔ)引擎;2.對(duì)于已經(jīng)創(chuàng)建完成的空表,可以任意調(diào)整其存儲(chǔ)引擎;3.對(duì)于非空表,不建議直接修改表的存儲(chǔ)引擎;良心建議:在創(chuàng)建表之初或者存儲(chǔ)數(shù)據(jù)之前,確定表的存儲(chǔ)引擎;刪除表:DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ... [RESTRICT | CASCADE]建議:使用修改表名稱的方式使指定表不再被繼續(xù)使用;修改表格式:ALTER [ONLINE | OFFLINE] [IGNORE] TABLE tbl_name [alter_specification [, alter_specification] ...]可以修改的內(nèi)容:ADD:字段,索引,約束,鍵(主鍵,唯一鍵,外鍵)CHANGE:字段名稱,字段定義格式和字段的位置;MODIFY:字段定義格式和字段的位置;DROP:字段,索引,約束,鍵;RENAME:修改表名稱;查看表結(jié)構(gòu):DESC [db_name.]tbl_name;查看表的定義方式:SHOW CREATE TABLE tbl_name;查看表的狀態(tài)和屬性信息:SHOW TABLE STATUS [from | in db_name] like 'PATTERN' | where expr;示例:MariaDB [hellodb]> show table status where name='students'\G視圖:VIEW,虛表;就是一個(gè)SELECT語句的執(zhí)行結(jié)果;創(chuàng)建視圖:CREATE VIEW view_name [(column_list)] AS SELECT clause;示例:MariaDB [hellodb]> create view student as select StuID,Name,Gender from students;刪除視圖:DROP VIEW [IF EXISTS] view_name [, view_name] ... [RESTRICT | CASCADE]示例:MariaDB [hellodb]> drop view student;注意:能否在視圖中實(shí)現(xiàn)插入新的數(shù)據(jù)記錄,取決于基表中沒有被視圖選擇的字段是否要求不能為空,如果有此類約束,則結(jié)果是無法插入新數(shù)據(jù);否則可以插入新數(shù)據(jù),沒有被視圖選擇的字段內(nèi)容,默認(rèn)都為"NULL";索引:索引的類型:聚集索引、非聚集索引:聚集索引:索引和數(shù)據(jù)存放在一起,找到索引即找到數(shù)據(jù);非聚集索引:索引和數(shù)據(jù)不存放在一起,索引通過索引指針指向數(shù)據(jù)所在位置;稠密索引、稀疏索引:是否索引了每一條數(shù)據(jù)記錄;稠密索引:每條數(shù)據(jù)記錄都有一條索引與之對(duì)應(yīng);稀疏索引:并不是每條數(shù)據(jù)記錄都有一條索引與之對(duì)應(yīng),而是一條索引對(duì)應(yīng)某個(gè)或某些數(shù)據(jù)塊;主鍵索引、輔助索引:BTree:Balance Tree,B- Tree,BTree,B+Tree左前綴索引:注意:在使用BTree索引進(jìn)行檢索時(shí),給出的PATTERN的最左側(cè)字符不要出現(xiàn)通配符,否則,無法使用索引進(jìn)行檢索;只能全文遍歷;Hash索引:R Tree:Spacial,空間索引;FULLTEXT:全文索引;覆蓋索引:索引中的內(nèi)容就是要檢索的內(nèi)容,通過檢索索引內(nèi)容即可立即找到數(shù)據(jù),并直接返回檢索結(jié)果;EXPLAIN:分析查詢語句的執(zhí)行路由;創(chuàng)建索引:1.在創(chuàng)建表時(shí),通過指定主鍵或唯一鍵,可以自動(dòng)創(chuàng)建索引;2.如果在創(chuàng)建表時(shí),沒有指定主鍵或唯一鍵,則可以在表成功創(chuàng)建之后添加索引;CREATE [ONLINE|OFFLINE] [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [index_type] ON tbl_name (index_col_name,...) [index_option] ...示例:MariaDB [hellodb]> create index name_index on students(Name);查看索引:SHOW {INDEX | INDEXES | KEYS} {FROM | IN} tbl_name [{FROM | IN} db_name] [WHERE expr]示例:MariaDB [hellodb]> show index from students\G刪除索引:DROP [ONLINE|OFFLINE] INDEX index_name ON tbl_name示例:MariaDB [hellodb]> drop index name_index on students;DML:操縱數(shù)據(jù);INSERT/REPLACE、DELETE、UPDATE、SELECEINSERT:向表中插入新的數(shù)據(jù)記錄;每次可以向表中插入一行或多行數(shù)據(jù);INSERT [INTO] tbl_name [(col_name,...)] {VALUES | VALUE} ({expr | DEFAULT},...),(...),...示例:MariaDB [hellodb]> insert into students (Name,Age,Gender) values ('Rio Messi',31,'M');MariaDB [hellodb]> insert into students (Name,Age,Gender) values ('Guo Jing',40,'M'),('Huang Rong',27,'F');沒有明確的規(guī)定字段名稱,則意味著為一行中的各個(gè)字段添加數(shù)據(jù)內(nèi)容:MariaDB [hellodb]> insert into students values (30,'Liu Bei',57,'M',1,2);注意:添加的數(shù)據(jù)內(nèi)容,必須要嚴(yán)格的對(duì)應(yīng)每個(gè)數(shù)據(jù)字段,需要保證數(shù)據(jù)類型的匹配;INSERT [INTO] tbl_name SET col_name={expr | DEFAULT}, ...示例:MariaDB [hellodb]> insert into students set Name='Tang Xuanzang',Age=35,Gender='M';INSERT [INTO] tbl_name [(col_name,...)] SELECT ...將后面SELECT語句的查詢結(jié)果插入到選中的目標(biāo)表中;注意下列問題:1.SELECT語句的查詢結(jié)果中包含的字段數(shù)量,應(yīng)該和目標(biāo)表中的指定字段數(shù)量相同;2.SELECT語句的查詢結(jié)果中包含的各字段的數(shù)據(jù)類型,必須要與目標(biāo)表中各字段的數(shù)據(jù)類型保持一致;此種插入數(shù)據(jù)的方法,更多的用于表復(fù)制操作;此前曾經(jīng)使用CREATE TABLE命令通過復(fù)制表格式的方式創(chuàng)建過一個(gè)空的新表,然后再將原表中的數(shù)據(jù)以方法復(fù)制到新表中;REPLACE命令與INSERT命令的功能幾乎完全相同,除了一種特殊情況之外:當(dāng)向表中插入數(shù)據(jù)時(shí),如果主鍵位置或唯一鍵位置出現(xiàn)重復(fù)數(shù)據(jù)時(shí),不會(huì)繼續(xù)插入而是選擇替換對(duì)應(yīng)行中各字段的數(shù)據(jù);DELETE:Single-table syntax:DELETE FROM tbl_name [WHERE where_condition] [ORDER BY ...] [LIMIT row_count]Multiple-table syntax:DELETE tbl_name[.*] [, tbl_name[.*]] ... FROM table_references [WHERE where_condition]Or:DELETE FROM tbl_name[.*] [, tbl_name[.*]] ... USING table_references [WHERE where_condition]注意:默認(rèn)情況下,MySQL或MariaDB都不會(huì)阻止不帶有WHERE條件子句的刪除操作,這將意味著,有可能會(huì)因?yàn)榇瞬僮鲗?dǎo)致清空整張表中的數(shù)據(jù);限制條件:WHERE where_conditionLIMIT row_countORDER BY ... LIMIT row_countWHERE where_condition LIMIT row_countWHERE where_condition ORDER BY ... LIMIT row_count示例:MariaDB [hellodb]> delete from students limit 3;刪除正常的查詢結(jié)果中的前三行數(shù)據(jù)記錄;MariaDB [hellodb]> delete from students where Age<20;刪除Age字段中值小于20的所有數(shù)據(jù)記錄;MariaDB [hellodb]> delete from students where Name like 'h%' limit 2;刪除Name字段以"H|h"開頭的所有數(shù)據(jù)記錄中的前兩條記錄;MariaDB [hellodb]> delete from students order by age desc limit 3;刪除根據(jù)Age字段進(jìn)行降序排序的查詢結(jié)果中的前三條數(shù)據(jù)記錄;UPDATE:Single-table syntax:UPDATE table_reference SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... [WHERE where_condition] [ORDER BY ...] [LIMIT row_count]Multiple-table syntax:UPDATE table_references SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... [WHERE where_condition]注意:默認(rèn)情況下,MySQL或MariaDB都不會(huì)阻止不帶有WHERE條件子句的修改操作,這將意味著,有可能會(huì)因?yàn)榇瞬僮鲗?dǎo)致整張表中的所有數(shù)據(jù)記錄被同時(shí)修改;限制條件:WHERE where_conditionLIMIT row_countORDER BY ... LIMIT row_countWHERE where_condition LIMIT row_countWHERE where_condition ORDER BY ... LIMIT row_count示例:同DELETE的示例;注意:在MySQL或MariaDB中,如果服務(wù)器變量sql_safe_updates=ON,則可以阻止不帶有限制條件的UPDATE更新操作或DELETE刪除操作;臨時(shí)調(diào)整:MariaDB [hellodb]> set @@sql_safe_updates=ON;永久生效:/etc/my.cnfsql_safe_updates=ONMariaDB [hellodb]> update students set ClassID=1;ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY columnSELECTQuery Cache:MySQL/MariaDB的查詢結(jié)果緩存;K/V對(duì)存儲(chǔ);Key:查詢語句經(jīng)過hash之后的hash值;Value:查詢語句的執(zhí)行結(jié)果;MySQL/MariaDB的查詢執(zhí)行路徑:1.用戶發(fā)送請(qǐng)求 --> 查詢緩存(命中) --> 響應(yīng)用戶;2.用戶發(fā)送請(qǐng)求 --> 查詢緩存(未命中) --> 解析器 --> 預(yù)處理器 --> [查詢優(yōu)化器 -->] 查詢執(zhí)行引擎 --> 存儲(chǔ)引擎 --> 查詢執(zhí)行引擎 --> [緩存查詢結(jié)果 -->] 響應(yīng)用戶;SELECT[ALL | DISTINCT | DISTINCTROW ][SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]select_expr [, select_expr ...][FROM table_references[WHERE where_condition][GROUP BY {col_name | expr | position}[ASC | DESC], ... [WITH ROLLUP]][HAVING where_condition][ORDER BY {col_name | expr | position}[ASC | DESC], ...][LIMIT {[offset,] row_count | row_count OFFSET offset}][PROCEDURE procedure_name(argument_list)][INTO OUTFILE 'file_name'[CHARACTER SET charset_name]export_options| INTO DUMPFILE 'file_name'| INTO var_name [, var_name]][FOR UPDATE | LOCK IN SHARE MODE]]DISTINCT:數(shù)據(jù)去重;即:重復(fù)出現(xiàn)的數(shù)據(jù)僅顯示一次;SQL_CACHE:顯式的指出必須將此次的查詢語句的執(zhí)行結(jié)果存放至查詢緩存;SQL_NO_CACHE:顯式的指出絕對(duì)不能將此次的查詢語句的執(zhí)行結(jié)果存放至查詢緩存;query_cache_type服務(wù)器變量是MySQL的緩存開關(guān),通常有三個(gè)取值:1.ON:啟用緩存功能;默認(rèn)緩存所有符合緩存條件的查詢結(jié)果;除非使用SQL_NO_CACHE參數(shù)明確指出不緩存查詢結(jié)果;2.OFF:關(guān)閉緩存功能;默認(rèn)不緩存任何查詢結(jié)果;僅能緩存使用SQL_CACHE參數(shù)明確的指出的查詢結(jié)果;3.DEMAND:按需緩存;如果明確指出SQL_CACHE,即緩存查詢結(jié)果,否則,默認(rèn)隱式關(guān)閉查詢緩存;query_cache_limit | 1048576query_cache_min_res_unit | 4096select_expr:*:表示表中的所有字段(列);col1,col2,...coln:普通的列名列表;通常用于執(zhí)行投影運(yùn)算;col_name1 as col_alias1,col_name2 as col_alias2, ...對(duì)于查詢結(jié)果中的各字段名稱使用別名進(jìn)行重定義;table_references:[db_name.]tbl_namedb_name.*[db_name.]tbl_name1,[db_name.]tbl_name2, ...[db_name.]tbl_name1 as tbl_alias1,[db_name.]tbl_name2 as tbl_alais2, ...單表查詢:select select_expr1,select_expr2,... from tbl_name where expr group by col_name having expr order by col_name limitWHERE條件子句:通過指明特定的過濾條件或表達(dá)式來實(shí)現(xiàn)"選擇"運(yùn)算;過濾條件有下列幾種:1.算術(shù)表達(dá)式:Age+10,算術(shù)操作符:+, -, *, /, %;2.比較表達(dá)式:Age+10<20;比較操作符:=, <=>, <>, !=, >, >=, <, <=;3.邏輯表達(dá)式:邏輯操作符:AND, OR, NOT, XOR;4.其他表達(dá)式:空值判斷:IS NULL, IS NOT NULL;連續(xù)區(qū)間判斷:BETWEEN ... AND ... 相當(dāng)于<=100 AND >=50;列表從屬關(guān)系判斷:IN (LIST);模糊值判斷:LIKE:可以支持通配符,%和_;如果想要使用索引實(shí)現(xiàn)加速檢索,則最左側(cè)字符不能使用通配符;RLIKE或REGEXP:可以支持正則表達(dá)式元字符;只要在查詢條件中包含正則表達(dá)式元字符,則一定無法使用索引進(jìn)行檢索;功能很強(qiáng)大,但檢索性能可能變差;GROUP BY子句:根據(jù)指定的字段將查詢結(jié)果進(jìn)行分組歸類,以方便進(jìn)行聚合運(yùn)算;常用的聚合運(yùn)算函數(shù):avg():取平均值運(yùn)算;max():取最大值運(yùn)算;min():取最小值運(yùn)算;sum():做和運(yùn)算;count():做次數(shù)統(tǒng)計(jì);示例:統(tǒng)計(jì)每個(gè)班級(jí)里面的人數(shù):MariaDB [hellodb]> select ClassID,count(ClassID) as nos from students group by ClassID;統(tǒng)計(jì)每個(gè)班級(jí)里面所有人的平均年齡:MariaDB [hellodb]> select ClassID,avg(Age) as nos from students where ClassID is not null group by ClassID;統(tǒng)計(jì)所有學(xué)生中男生和女生的平均年齡:MariaDB [hellodb]> select Gender,avg(Age) as nos from students group by Gender;HAVING子句:對(duì)于經(jīng)過分組歸類并進(jìn)行了聚合運(yùn)算以后的結(jié)果進(jìn)行條件過濾;其條件表達(dá)式的書寫格式與WHERE子句相同;示例:統(tǒng)計(jì)人數(shù)超過3人的班級(jí)及其人數(shù)數(shù)據(jù):MariaDB [hellodb]> select ClassID,count(ClassID) as nos from students where ClassID is not null group by ClassID having nos>=3;ORDER BY子句:根據(jù)指定的字段將查詢結(jié)果進(jìn)行排序,可以使用升序或降序,默認(rèn)是升序;升序:ASC降序:DESC示例:MariaDB [hellodb]> select ClassID,count(ClassID) as nos from students where ClassID is not null group by ClassID having nos>=3 order by nos desc;LIMIT子句:對(duì)于查詢的結(jié)果進(jìn)行限定行數(shù)的輸出;LIMIT {[offset,] row_count | row_count OFFSET offset}1.LIMIT [offset,] row_countoffset:偏移量,在輸出結(jié)果中,從第一行開始(含)跳過的不顯示的行數(shù);row_count:要顯示的行數(shù);示例:顯示查詢結(jié)果中的第二行和第三行;MariaDB [hellodb]> select ClassID,count(ClassID) as nos from students where ClassID is not null group by ClassID having nos>=3 order by nos desc limit 1,2;2.LIMIT row_count OFFSET offset示例:顯示查詢結(jié)果中的第二行和第三行;MariaDB [hellodb]> select ClassID,count(ClassID) as nos from students where ClassID is not null group by ClassID having nos>=3 order by nos desc limit 2 offset 1;多表查詢:建議:在生成環(huán)境中,能使用單表查詢即可得到結(jié)果的操作,盡可能使用單表查詢;因?yàn)槎啾聿樵儠?huì)給服務(wù)器造成過大的負(fù)載壓力;所謂多表查詢,即指通過對(duì)多個(gè)表內(nèi)容的查詢,以獲得具有一定關(guān)聯(lián)關(guān)系的查詢結(jié)果的查詢方式;也稱為連接操作,連接操作也就是將多張表關(guān)聯(lián)在一起的方法;連接操作:交叉連接:也稱為笛卡爾積連接;內(nèi)連接:等值連接:讓表和表之間通過某特定字段的等值判斷的方式建立的內(nèi)連接;非等值連接:讓表和表之間通過某特定字段的不等值判斷的方式建立的內(nèi)連接;在極少的場(chǎng)合中才有應(yīng)用;外連接:以某張為基準(zhǔn)表,判斷參考表與基準(zhǔn)表之間的連接關(guān)系;左外連接:以左表為基準(zhǔn)表,右表為參考表,顯示出基準(zhǔn)表中所有的行,并將參考表中與基準(zhǔn)表中有關(guān)聯(lián)關(guān)系的行合并輸出,如果基準(zhǔn)表中的行與參考表中無關(guān),則輸出NULL;連接操作符:LEFT JOIN右外連接:以右表為基準(zhǔn)表,左表為參考表,顯示出基準(zhǔn)表中所有的行,并將參考表中與基準(zhǔn)表中有關(guān)聯(lián)關(guān)系的行合并輸出,如果基準(zhǔn)表中的行與參考表中無關(guān),則輸出NULL;連接操作符:RIGHT JOIN自然連接:通過MySQL的進(jìn)程自行判斷并完成的連接過程。通常MySQL會(huì)使用表中的名稱相同的字段作為基本的連接條件;連接操作符:NATRUAL INNER自然外連接:自然左外連接:連接操作符:NATURAL LEFT JOIN自然右外連接:連接操作符:NATURAL RIGHT JOIN自連接:人為的將一張表中的兩個(gè)字段之間建立的連接關(guān)系;示例:交叉內(nèi)連接:每個(gè)學(xué)生所在的班級(jí)名稱:MariaDB [hellodb]> select Name,Class from students as s,classes as c where s.CLassID=c.ClassID;MariaDB [hellodb]> select Name,Class from students,classes where students.CLassID=classes.ClassID;交叉左外連接:每個(gè)學(xué)生所在班級(jí)的名稱,即使該學(xué)生不屬于任何班級(jí):MariaDB [hellodb]> select Name,Class from students left join classes on students.CLassID=classes.ClassID;交叉右外連接:每個(gè)班級(jí)的學(xué)生姓名,即使該班級(jí)中沒有任何學(xué)生;MariaDB [hellodb]> select Class,Name from students right join classes on students.ClassID=classes.ClassID;||MariaDB [hellodb]> select Class,Name from classes left join students on students.ClassID=classes.ClassID;子查詢:嵌套查詢;在SELECT查詢語句中嵌套另一個(gè)SELECT查詢語句;等同于從某個(gè)視圖中獲取查詢結(jié)果;SELECT col1,col2,* FROM tbl_name WHERE col OPTS VALUE;示例:用于WHERE子句中的子查詢:查詢學(xué)生中年齡大于全班平均年齡的學(xué)生的姓名和年齡;MariaDB [hellodb]> select Name,Age from students where Age>(select avg(Age) from students);用于IN子句中的子查詢:查詢學(xué)生的年齡和老師的年齡相同的學(xué)生的名字:MariaDB [hellodb]> select Name from students where Age in (select Age from teachers);查詢學(xué)生的年齡和老師的年齡相同的學(xué)生和老師的名字:MariaDB [hellodb]> select t.Name as Teacher,s.Name as Student from students as s,teachers as t where s.Age=t.Age;用于FROM子句的子查詢:查詢有班級(jí)的學(xué)生對(duì)應(yīng)的班級(jí)名稱:MariaDB [hellodb]> select s.Name,s.Class from (select StuID,students.Name,students.Age,Gender,Class from students,classes where students.ClassID=classes.ClassID) as s;聯(lián)合查詢:將多張表的內(nèi)容通過多個(gè)SELECT語句查詢得到的結(jié)果組合輸出;注意:使用聯(lián)合查詢的前提條件:多張表需要有相同數(shù)據(jù)類型的字段;操作符:UNION示例:MariaDB [hellodb]> select StuID as ID,Name,Age,Gender from students union select TID as ID,Name,Age,Gender from teachers;select查詢:單表查詢 --> 多表查詢(交叉內(nèi)連接) --> 多表查詢(外連接) --> 子查詢 --> 聯(lián)合查詢;MySQL的用戶和權(quán)限管理:用戶賬號(hào):'Username'@'Hostname'skip_name_resolve = ON'user'@'172.16.0.1''user'@'a.qhdlink.com'skip_name_resolve = OFFClient_IP --> Client_Hostname在MySQL上能夠?qū)嵤┑挠脩糍~戶的管理操作:CREATE USERDROP USERGRANTRENAME USERREVOKESET PASSWORDMySQL中的權(quán)限類別:庫(kù)級(jí)別;表級(jí)別;字段級(jí)別;管理類;程序類;管理類的權(quán)限:CREATE USERDROP USERRELOADLOCK TABLESREPLICATION CLIENTREPLICATION SLAVESHUTDOWNFILESHOW DATABASESPROCESSSUPER程序類的權(quán)限:FUNCTIONPROCEDURETRIGGER操作:CREATE,ALTER,DROP,EXECUTE庫(kù)級(jí)別和表級(jí)別的權(quán)限:CREATEALTERSHOWDROPINDEXCREATE VIEWSHOW VIEWGRANT OPTION:能夠?qū)⒐芾韱T自身獲得的權(quán)限生成一個(gè)副本,并轉(zhuǎn)贈(zèng)給目標(biāo)用戶;表級(jí)別的數(shù)據(jù)操作的權(quán)限:INSERTREPLACEDELETEUPDATESELECT字段級(jí)別(列級(jí)別)的數(shù)據(jù)操作的權(quán)限:SELECT(col1,col2,...)UPDATE(col1,col2,...)INSERT(col1,col2,...)所有的權(quán)限:ALLALL PRIVILEGESMySQL的元數(shù)據(jù)數(shù)據(jù)庫(kù):mysql數(shù)據(jù)字典數(shù)據(jù)庫(kù);hostdbusercolumn_privprocs_privproxies_privetables_priv上述元數(shù)據(jù)數(shù)據(jù)庫(kù)中的表統(tǒng)稱為"授權(quán)表";如果對(duì)于授權(quán)表的內(nèi)容進(jìn)行了修改,MySQL每300秒會(huì)自動(dòng)重讀并使新設(shè)置生效;如果不打算等待,可以手動(dòng)刷新授權(quán)表:MariaDB [mysql]> FLUSH PRIVILEGES;MySQL用戶管理:'Username'@'Hostname'Username:任意的字符串組合,只能包含基本意義的字符;可以包含"_"、"."、"-";Hostname:FDQNDomain_nameIP_ADDRESS可以使用MySQL的專用通配符:%, _skip_name_resolve={ON|OFF}創(chuàng)建用戶賬戶:CREATE USER語句:CREATE USER user [IDENTIFIED BY [PASSWORD] 'password' | IDENTIFIED WITH auth_plugin [AS 'auth_string']]示例:MariaDB [mysql]> create user 'testuser'@'%';MariaDB [mysql]> create user 'testuser'@'%' identified by 'qhdlink';也可以使用DML語句創(chuàng)建用戶賬戶:INSERT INTO mysql.user SET User='testuser',Host='%',Password=PASSWORD('qhdlink');示例:MariaDB [mysql]> insert into user set User='user1',Host='%',Password=PASSWORD('qhdlink'),ssl_cipher='',x509_issuer='',x509_subject='',authentication_string='';重命名用戶賬戶:RENAME USER語句:RENAME USER old_user TO new_user [, old_user TO new_user] ...示例:MariaDB [mysql]> rename user 'testuser'@'%' to 'test'@'172.16.%.%';也可以使用DML語句重命名用戶賬戶:示例:MariaDB [mysql]> update user set User='user01',Host='172.16.75.%' where User='user1';刪除用戶賬戶:DROP USER語句:DROP USER user [, user] ...示例:MariaDB [mysql]> drop user 'test'@'172.16.%.%';也可以使用DML語句刪除用戶賬戶:示例:MariaDB [mysql]> delete from user where User='user01';用戶賬戶的密碼管理:1.SET PASSWORD語句:SET PASSWORD [FOR user] = { PASSWORD('cleartext password') | OLD_PASSWORD('cleartext password') | 'encrypted password' }示例:MariaDB [mysql]> set password for 'test'@'%' = PASSWORD('qhdlink');2.也可以使用DML語句修改用戶賬戶密碼:示例:MariaDB [mysql]> update user set Password=PASSWORD('qhdlink.com') where User='test';3.mysqladmin工具:# mysqladmin -uUSERNAME -hHOSTNAME -p password 'NEW_PASSWORD'注意:執(zhí)行此操作的MySQL用戶需要對(duì)mysql.user表有修改權(quán)限;忘記MySQL管理員的密碼的解決辦法:方法一:1.停止當(dāng)前的MySQL或MariaDB服務(wù);2. 在/etc/my.cnf文件中加入下列兩條服務(wù)器參數(shù):skip-grant-tables = ONskip-networking = ON3.啟動(dòng)MySQL或MariaDB服務(wù),使用mysql或mysqladmin客戶端工具以空秘密的root用戶登錄,進(jìn)行root用戶的密碼修改;4.從/etc/my.cnf中刪除上述兩條服務(wù)器參數(shù),再重啟服務(wù)即可;方法二:1.停止當(dāng)前的MySQL或MariaDB服務(wù);2.使用命令啟動(dòng)MySQL服務(wù):# mysqld_safe --skip-grant-tables --skip-networking3.啟動(dòng)另一個(gè)會(huì)話連接,并使用mysql或mysqladmin客戶端工具以空密碼的root用戶的身份修改其密碼;4.kill掉此前的mysqld-safe及衍生的mysqld服務(wù);5.再正常啟動(dòng)服務(wù)即可;對(duì)于已經(jīng)建立的用戶或未建立的用戶進(jìn)行授權(quán):GRANT語句:GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ...ON [object_type] priv_levelTO user_specification [, user_specification] ...[REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}][WITH with_option ...]priv_type:SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, SHUTDOWN, FILE, SHOW DATABASES, PROCESS, SUPERobject_type:TABLE | FUNCTION | PROCEDUREpriv_level:* | *.* | db_name.* | db_name.tbl_name | tbl_name | db_name.routine_name*:表示所有的數(shù)據(jù)庫(kù);*.*:表示所有數(shù)據(jù)庫(kù)中的所有表對(duì)象;db_name.*:表示指定數(shù)據(jù)庫(kù)中的所有表對(duì)象;db_name.tbl_name:表示指定數(shù)據(jù)庫(kù)中的指定的表對(duì)象;tbl_name:表示當(dāng)前正在使用的數(shù)據(jù)庫(kù)中的指定的表對(duì)象;db_name.routine_name:表示指定數(shù)據(jù)庫(kù)中的指定存儲(chǔ)函數(shù)后存儲(chǔ)過程對(duì)象;通常需要使用object_type參數(shù)共同決定;user_specification:user [ IDENTIFIED BY [PASSWORD] 'password' | IDENTIFIED WITH auth_plugin [AS 'auth_string' ] ]ssl_option:SSL | X509 | CIPHER 'cipher' | ISSUER 'issuer' | SUBJECT 'subject'with_option:GRANT OPTION | MAX_QUERIES_PER_HOUR count | MAX_UPDATES_PER_HOUR count | MAX_CONNECTIONS_PER_HOUR count | MAX_USER_CONNECTIONS count示例:MariaDB [mysql]> grant all privileges on hellodb.* to 'test'@'%';MariaDB [mysql]> grant select,update on hellodb.students to 'test'@'%';MariaDB [mysql]> grant select(Name,Age,ClassID) on hellodb.students to 'test'@'%';也可以對(duì)某些基本表創(chuàng)建視圖之后,再對(duì)視圖進(jìn)行用戶權(quán)限授權(quán):MariaDB [hellodb]> create view stu_base as select Name,Age,ClassID from students;MariaDB [hellodb]> grant all on hellodb.stu_base to 'test'@'%';取消授權(quán)/收回授權(quán):REVOKE語句:REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ...ON [object_type] priv_levelFROM user [, user] ...REVOKE ALL PRIVILEGES, GRANT OPTIONFROM user [, user] ...示例:MariaDB [mysql]> revoke delete on hellodb.* from 'test'@'%';MariaDB [mysql]> revoke all on hellodb.students from 'test'@'%';MariaDB [mysql]> revoke select(Age,ClassID) on hellodb.students from 'test'@'%';注意:在取消已經(jīng)做出的授權(quán)時(shí),REVOKE語句所指定的priv_level部分應(yīng)該和授權(quán)時(shí)GRANT語句所指定的priv_level保持絕對(duì)一致;否則判定此次取消授權(quán)的操作失敗;示例:前提是testdb數(shù)據(jù)庫(kù)中包含有tb1和tb2兩張表;MariaDB [testdb]> grant all on testdb.* to 'test'@'%';MariaDB [testdb]> revoke all on testdb.tb2 from 'test'@'%';ERROR 1147 (42000): There is no such grant defined for user 'test' on host '%' on table 'tb2'正確的取回授權(quán)的方式:MariaDB [testdb]> revoke all on testdb.* from 'test'@'%';MariaDB [testdb]> grant all on testdb.tb1 to 'test'@'%';此時(shí),'test'@'%'用戶就只有對(duì)testdb數(shù)據(jù)庫(kù)中tb2表有所有操作權(quán)限;查看用戶的授權(quán):SHOW GRANTS語句:SHOW GRANTS [FOR user]

MySQL的存儲(chǔ)引擎:
存儲(chǔ)引擎也稱為表類型;表級(jí)別的概念;
原則上來說,每張表都可以獨(dú)立地使用某一個(gè)存儲(chǔ)引擎;
出于穩(wěn)定性考慮,在同一個(gè)數(shù)據(jù)庫(kù)中的多張表最好選擇同一種存儲(chǔ)引擎;

對(duì)于MySQL或MariaDB來說,支持插件式存儲(chǔ)引擎:默認(rèn)情況下,如果使用RPM包安裝的MySQL或MariaDB,插件文件所在的目錄為:/usr/lib64/mysql/plugin安裝一個(gè)插件:INSTALL PLUGIN plugin_name SONAME 'shared_library_name'plugin_name的相應(yīng)內(nèi)容,可以參考官方站點(diǎn):http://dev.mysql.com/doc/refman/5.5/en/plugin-data-structures.html示例:MariaDB [mysql]> install plugin sphinx soname 'ha_sphinx.so';注意:使用此方法安裝插件(存儲(chǔ)引擎)之后,會(huì)立即自動(dòng)激活;卸載一個(gè)插件:UNINSTALL PLUGIN plugin_name示例:MariaDB [mysql]> uninstall plugin sphinx;注意:每張表,只能使用一個(gè)存儲(chǔ)引擎;如果在創(chuàng)建表時(shí)沒有給出指定的存儲(chǔ)引擎,MySQL會(huì)將新建表的存儲(chǔ)引擎設(shè)置為默認(rèn)的存儲(chǔ)引擎;使用SHOW ENGINES命令查看時(shí),support字段的值為DEFAULT的即為當(dāng)前MySQL的默認(rèn)存儲(chǔ)引擎;當(dāng)前版本的MariaDB中,默認(rèn)存儲(chǔ)引擎為"InnoDB";在創(chuàng)建表時(shí),可以用的一個(gè)選項(xiàng):CREATE TABLE tbl_name (...) ENGINE [=] engine_name;在表創(chuàng)建之后,插入數(shù)據(jù)之前,可以修改存儲(chǔ)引擎的類型:ALTER TABLE tbl_name ENGINE [=] engine_name注意:不同的存儲(chǔ)引擎對(duì)于數(shù)據(jù)的管理方式會(huì)不同,有時(shí)可能會(huì)有很大區(qū)別,因此,對(duì)于空表來說,可以任意修改其存儲(chǔ)引擎;對(duì)于已經(jīng)存放了數(shù)據(jù)的表來說,強(qiáng)烈不建議修改表的存儲(chǔ)引擎;當(dāng)前MySQL系統(tǒng)上默認(rèn)可以使用的存儲(chǔ)引擎:MyISAM:最經(jīng)典的MySQL的存儲(chǔ)引擎;對(duì)于MyISAM而言,有一個(gè)缺陷——如果MySQL運(yùn)行時(shí)因意外崩潰,再重啟時(shí)需要對(duì)表進(jìn)行修復(fù),而MyISAM存儲(chǔ)引擎無法保證表的安全修復(fù);Aria:具有崩潰后安全修復(fù)表特性的增強(qiáng)版的MyISAM存儲(chǔ)引擎;InnoDB:CSV:基于文本文件存儲(chǔ)數(shù)據(jù)的存儲(chǔ)引擎;跨數(shù)據(jù)庫(kù)實(shí)現(xiàn)數(shù)據(jù)彼此交換時(shí),比較有用;但CSV中存放的浮點(diǎn)類型的數(shù)值數(shù)據(jù)一定會(huì)損失數(shù)據(jù)精度;MRG_MYISAM:用于實(shí)現(xiàn)將多個(gè)MyISAM表在邏輯層上連接在一起,用戶就像使用一張表一樣去使用多張表;BLACKHOLE:黑洞存儲(chǔ)引擎,在級(jí)聯(lián)復(fù)制時(shí)比較有用;一般用于記錄binlog做復(fù)制的中繼;MEMORY:內(nèi)存級(jí)的存儲(chǔ)引擎;無法實(shí)現(xiàn)數(shù)據(jù)持久功能,多用于作為臨時(shí)表(內(nèi)存表)的存儲(chǔ)引擎;MEMORY是唯一的支持用戶顯式定義hash索引的存儲(chǔ)引擎,因此其查詢速度是非??斓?#xff1b;PERFORMANCE_SCHEMA展示MySQL運(yùn)行過程中的狀態(tài)參數(shù)和統(tǒng)計(jì)數(shù)據(jù);這些統(tǒng)計(jì)數(shù)據(jù)本身是MySQL內(nèi)部的專有數(shù)據(jù)結(jié)構(gòu),但是有時(shí)用戶需要查詢這些信息,因此PERFORMANCE_SCHEMA就將此類數(shù)據(jù)虛化成一個(gè)MySQL認(rèn)為可以使用的關(guān)系型接口(表);ARCHIVE:歸檔存儲(chǔ)引擎,通常用來做數(shù)據(jù)倉(cāng)庫(kù);這種類型的存儲(chǔ)引擎一般僅支持select和insert語句,且本身不支持索引。適合于存放大量的獨(dú)立的作為歷史記錄的數(shù)據(jù)。ARCHIVE存儲(chǔ)引擎擁有高效的插入速度,查詢速度相對(duì)較慢,用于日志記錄和聚合函數(shù)分析較合適;FEDERATED:將不同MySQL服務(wù)器聯(lián)合起來,邏輯上組成一個(gè)完整的數(shù)據(jù)庫(kù)。非常適合于分布式應(yīng)用;MyISAM存儲(chǔ)引擎:優(yōu)點(diǎn):支持全文索引(FULLTEXT INDEX),可以實(shí)現(xiàn)類似于搜索引擎的功能;實(shí)施數(shù)據(jù)的高效檢索支持R TREE索引(空間函數(shù)的支持(GIS))支持?jǐn)?shù)據(jù)的壓縮存儲(chǔ);一旦數(shù)據(jù)被壓縮,使得數(shù)據(jù)的占用空間更小,但是只能檢索;支持復(fù)雜的行格式定義:ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}缺點(diǎn):不支持事務(wù);鎖粒度粗糙,僅支持表級(jí)鎖;崩潰后無法保證表能夠進(jìn)行安全修復(fù);(Aira)MyISAM存儲(chǔ)引擎的適用場(chǎng)景:1.只讀或讀多寫少的場(chǎng)景2.較小的表,以保證崩潰后修復(fù)的時(shí)間較短,數(shù)據(jù)丟失較少;MyISAM存儲(chǔ)引擎管理數(shù)據(jù)表文件的方式:每個(gè)由MyISAM存儲(chǔ)引擎管理的表,都包含三個(gè)文件,直接存儲(chǔ)于數(shù)據(jù)庫(kù)目錄中;tbl_name.frm:format,表格式定義的內(nèi)容;tbl_name.MYD:MyISAM Data,表中的數(shù)據(jù)內(nèi)容;tbl_name.MYI:MyISAM Index,表中可用的索引;總結(jié):性能:表級(jí)鎖,并發(fā)訪問性能相對(duì)較差,尤其是寫鎖,阻塞所有的讀操作,串行訪問;支持非聚集索引,全文索引及空間索引,檢索數(shù)據(jù)時(shí)的速度和效率相對(duì)較高;表壓縮,只能讀,無法接收寫操作請(qǐng)求;延遲的索引更新,比較合理的利用磁盤IO的性能;數(shù)據(jù)安全:支持手動(dòng)或自動(dòng)修復(fù),但可能會(huì)導(dǎo)致數(shù)據(jù)丟失;InnoDB:SleepycatBerkeley DB;InnoBase,研發(fā)了InnoDB存儲(chǔ)引擎,參考了Oracle的主流存儲(chǔ)引擎;Percona:InnoDB - Percona-XtraDB, Supports transactions, row-level locking, and foreign keysACID:AUTOMICITY:原子性;CONSISTENCY:一致性;ISLATION:隔離性;DURABILITY:持久性;特點(diǎn):1.InnoDB存儲(chǔ)引擎將數(shù)據(jù)存儲(chǔ)于"表空間"中;(Table Space)表空間是一個(gè)自組織的自管理的文件系統(tǒng);默認(rèn)的表空間是所有的表在同一個(gè)表空間中;即所有的表在同一個(gè)文件中;innodb_file_per_table=OFF意味著所有的InnoDB存儲(chǔ)引擎所管理的表,包括數(shù)據(jù),表格式及索引都在同一個(gè)表空間中;文件名:/$DATA_DIR/ibdata1innodb_file_per_table=ON意味著每張表使用單獨(dú)的表空間;每張表都使用兩個(gè)文件表示表空間:tbl_name.ibdtbl_name.frm注意:如果在設(shè)置innodb_file_per_table=ON服務(wù)器參數(shù)之前已經(jīng)創(chuàng)建了利用InnoDB存儲(chǔ)引擎管理的表,則其表空間不會(huì)因?yàn)樵O(shè)置該服務(wù)器參數(shù)而變化;只有在定義了該參數(shù)之后新建的表才能以單獨(dú)的表空間進(jìn)行數(shù)據(jù)存儲(chǔ);應(yīng)該盡早設(shè)置該服務(wù)器參數(shù);在安裝服務(wù)結(jié)束之后第一次啟動(dòng)服務(wù)之前配置該服務(wù)器參數(shù)為最佳選擇;2.支持事務(wù):事務(wù)型存儲(chǔ)引擎,適合對(duì)事務(wù)要求較高的場(chǎng)景的應(yīng)用;但是對(duì)于大量處理的短期事務(wù)支持的更好;為了實(shí)現(xiàn)事務(wù)的隔離,并且盡可能提高并行處理效率,定義了四種不同的隔離級(jí)別;3.精細(xì)鎖粒度支持:表級(jí)鎖:頁(yè)級(jí)鎖:行級(jí)鎖:間隙鎖:防止幻讀;4.支持聚集索引,主鍵索引以及輔助索引;支持自適應(yīng)的hash索引;MySQL或MariaDB還支持很多的額外的第三方開源社區(qū)級(jí)別的存儲(chǔ)引擎:Sphinx存儲(chǔ)引擎:全文索引的存儲(chǔ)引擎;OQGraph:圖示存儲(chǔ)引擎;Cassandra:FaceBook研發(fā)的無中心節(jié)點(diǎn)的分布式NoSQL的數(shù)據(jù)庫(kù)的存儲(chǔ)引擎;HBase(ASF)ConnectSquenceToKuDB:1.將數(shù)據(jù)處理性能提升20-80倍;2.支持壓縮,支持壓縮時(shí)寫操作;3.數(shù)據(jù)量擴(kuò)展到數(shù)個(gè)TB;4.完全避免索引碎片;5.支持事務(wù);6.支持億級(jí)行海量數(shù)據(jù)存儲(chǔ);...

轉(zhuǎn)載于:https://blog.51cto.com/huliheeyu/2149090

總結(jié)

以上是生活随笔為你收集整理的MariaDB(MySQL)数据库的介绍及使用示例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。