數據庫的本質、概念及其應用實踐

今天這堂課,分爲三個大點,正如標題所指出的,是討論數據的本質、概念與應用實踐。第一點本質的探討是站在一個更高的高度來分析數據的產生以及各類使用場景,而後將數據相關的存儲手段,做一個彙總講解。而概念,則是一個串講,主要放在關係數據庫上,由於咱們六月份公開課,也將以關係型數據庫爲主。第三點就是經過一些實例來鞏固前面兩點所講的內容。php

 

1、數據庫的出現源起和本質

1.1 數據庫的起源

想像一下咱們的電腦,有目錄,有文件,文件有大小,有位置,有格式,這個是有文件系統開始就有這個概念的,確定在有一個地方,存儲了這些文件的參數或者元數據,而在咱們的平常生活中,每個物體和人,都有其各自不一樣的特徵,當一批量的這些可描述的人的特徵,想要數據化存儲起來的時候,也就須要有一種格式來保存。除了保存數據以外,咱們還得對數據進行管理。這就是數據庫出現的背景,而且隨着使用場景的越加複雜,數據庫自己也有了更多的衍生版本。html

因此數據庫起源於對數據的存儲以及管理。java

 

1.2數據庫的使用場景

那麼咱們有幾個問題, 基於你們目前的理解,第一個問題是有哪些須要保存的數據種類,有哪些存儲方式呢?咱們發散一點來想。mysql

 

能夠獲得以下的狀況:linux

A、在程序中自定義,好比數組,只保存在內存裏,等程序中止了以後,數據就沒有了。這樣能夠不能夠?git

在這個裏面存儲的反正是描述型數據,也能夠是二進制數組。github

 

B、保存在一個文本文件裏能夠不能夠,有本身的格式,好比自定義的格式,好比XML,好比JSON格式redis

這裏保存的,只能是描述型數據。sql

 

C、採用一些文件型數據庫,好比支持SQL訪問的文本數據庫,好比Sqlite、好比Access數據庫

除了特定的數據類型,通常也只保存文本描述數據。

 

D、採用 MySQL 這樣基於網絡和可分佈式的數據庫系統。

用來保存較多數據量的用戶數據、關係數據、交易數據,這些數據要實再快速查詢更新。

 

E、當數據量大時,一臺設備就不能知足要求,這就須要用到分佈式數據庫,多是數據集羣

 

F、採用 memcached 這樣的軟件保存着緩存的數據。

通常用於保存文本數據或者計數。

 

G、採用 fastdfs 這樣的分佈式文件系統來保存着文件數據。

不用於保存除文件自己描述以外的其餘描述數據,用於保存大量的文件。

 

H、採用redis 這樣的KVDB 軟件來保存簡單關係的描述數據,或者特定的結構。

好比用於保存微博數據,用KEY能夠迅速定位到微博內容。

 

I、同KVDB相似的,你們有聽過隊列那幾講的同窗嗎?是否是也是特殊的數據存儲手段呢?一邊有人生產數據,一邊有人消費數據。

 

J、用於保存地理關係數據,並提供運算。在英文裏叫Spatial Data,也就是空間數據。Oracle最擅長,如今MySQL也有空間擴展。

http://dev.mysql.com/doc/refman/5.1/zh/spatial-extensions-in-mysql.html

 

 

K、而對於大量的,源源不斷的海量數據,相對不那麼規則的數據存儲,咱們可能存儲在Hadoop系統中。

 

L、最後再談一個場景,像百度這樣的搜索引擎,他會把他的數據全放在MySQL裏,而後去檢索嗎?顯然不是。有自有的索引格式和支持分佈式查詢的系統 。

 

1.3數據庫場景以及分類總結

總結一下:

A、在電腦時代之前,人類就產生了大量的信息,而電腦時代以來,更是產生了大量的數字化的數據。而這些數據庫的保存的形式,從上面能夠看到,依據不一樣的場景,不一樣的保存方式,是多種多樣的。有僅在內存中保存,有在文件中保存,有專用嚴謹的數據庫系統保存,也有不那麼嚴謹的KVDB保存。

 

 

B、根據上面的各類存儲場景,咱們對數據,也作兩個簡單的分類,一個是結構化數據庫和非結構化數據的分類,固然,還有再加一種半結構化數據的。所謂結構化,就是很規整地有屬性的一種狀況。像一我的,他有身高、體重、年齡,這個描述是結構化的,你給照一張照片,錄一段聲音,拍一段攝像,儘管這也是數據,可是不是結構化的。對於不一樣的這兩類數據,存儲方式也不相同,好比結構化數據是典型的二維表的結構。而非結構化數據就是隻以原始數據的形式存儲。

上面的場景,大可能是結構化數據的處理場景,像文本數據庫、MySQL數據庫。而在fastdfs上,Hadoop上,就有大量的非結構化數據的存儲。

 

 

C、根據數據量自己的大小,咱們也能夠作一個分類。或者特定的技術應用場景。

好比小數據量數據,咱們可能爲了方便,就以文本的方式來保存。而對於一個正規的提供服務的網站,像用戶數據,好比優才網的用戶數據,就會用MySQL數據庫來保存,爲了訪問速度,也會用到memcached這樣的緩存軟件。也會用fastdfs來保存小文件。而當有大量的日誌等數據量產生,須要進行數據分析的時候,好比天天的數據量以幾百G,T來計的時候,就會用Hadoop 這樣的軟件。

 

因此,不一樣的數據量也使用不一樣的保存方式。小型數據、大中型數據、海量數據或者大數據。

 

D、第四個角度就是從上面能夠看出,數據的存儲方式,有不少類別,不一樣類別適用於不一樣的場景。數據庫是很強大的,可是不是全部的場景都合適使用數據庫。好比上面講的全文檢索的場景,通常須要用特定的存儲,特定的索引方式。若是具體地講,全文檢索中,使用的一種索引,叫倒排索引。

 

2、數據庫有哪些概念

好的,聊完了數據以及相關軟件的一些使用場景,對於不一樣場景下使用不一樣軟件有了概念。下面咱們來介紹一下,在數據庫的領域經常使用的 一些術語,這些術語,在咱們的整個數據庫學習中都要用到。

 

因爲公開課的時間問題,咱們主要交流一下基本概念,對於高級的概念,後面的公開課會持續地講到。

 

2.1 數據庫的基本概念

介紹咱們下面數據庫的這些概念時,咱們以一個公司作爲對比。

 

2.1.一、庫

庫,就相對於一個公司,下面幾乎全部的概念都裝在這個公司裏的。

在使用數據庫以前,咱們得在數據庫軟件上建立數據庫。

在 MySQL 裏,同一個鏈接,只能附着在同一個庫上,固然,只要權限容許,也能夠實現跨庫查詢。

建立數據庫的語法是

 create database xxx;

只有root 用戶能建立庫。

 

2.1.二、表

表就相對於,公司的一個部門,這個部門管用戶,那個部門管訂單。就是一個又一個的表。

表由記錄和字段組成。

字段表成的是表定義。

記錄組成的是表數據。

CREATE TABLE `hstesttbl` (

  `k` int(11) NOT NULL AUTO_INCREMENT,

  `v` char(255) NOT NULL DEFAULT '',

  PRIMARY KEY (`k`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

  

字段定義則有字段名,字段類型,是否爲空,是否自增加,缺省值等。

記錄則是實際的數據值,同一個表的記錄的定義都是同樣的。也就是說有相同的特徵。

 

2.1.三、視圖

視圖類就至關於虛擬的項目小組,能夠是同一個部門出來的,也能夠是跨部門的。

視圖之因此說是虛擬,由於沒有實際存在的數據。不管是定義,仍是數據,都是從別的表裏組合起來的。

create view hsview as select * from hstesttbl;

 

mysql> show tables;

+--------------------+

| Tables_in_hstestdb |

+--------------------+

| hstesttbl          |

| hsview             |

+--------------------+

2 rows in set (0.02 sec)

 

mysql> show create table hsview\G;

*************************** 1. row ***************************

                View: hsview

         Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `hsview` AS select `hstesttbl`.`k` AS `k`,`hstesttbl`.`v` AS `v` from `hstesttbl`

  

從上面的命令能夠看出,視圖跟表的操做有不少類似。而且從表到視圖還能修改字段名。

 

2.1.四、索引

索引就是至關於部門每一個員工的一些用於快速找到員工的屬性。好比職位,好比愛好,好比畢業學校。經過這些,就能將部門的人分類,每一次查詢都能縮小結果集。

 

對錶建立索引是,好比仍是上面這個表, alter table hstesttbl add index(xxx);

 

 

2.1.五、鍵

鍵就至關於部門每一個人的一些最快捷且惟一的聯絡方式,好比電話、郵箱,微信號,QQ號都是。

添加鍵跟添加索引,相似,刪除鍵這裏介紹一下,

好比:

alter table hstesttbl drop primary key;

 

2.1.六、權限

是指公司內部限制的一些紀律,好比公司外部人,是不能知道公司內部的一些事情的。

咱們能夠經過

grant ALL PRIVILEGES on dbname.* to 'user'@'127.0.0.1' identified by 'password' with grant option;

這樣的語句給某用戶受權,全權訪問某個庫。這個這個用戶只能訪問這個庫,在沒有得到更多受權的狀況下。

 

上面說只有root用戶能建立數據庫,而對於上面的其餘操做,好比建立表,添加視圖,新建、刪除索引和鍵,只要通過了上面的受權,就能夠作了。

 

2.1.七、SQL

SQL就至關於公司的一些規定,指令。好比咱們在公司裏交流說,能夠發佈到生產環境了。聽起來一句簡單的話,包含着可能進行了產品確認,各類測試,能夠由運維上線了。

SQL是咱們同數據庫打交道的指令。上面其實在講各個概念時,已經都講過了一些SQL命令,我想這裏提幾個點。

 

手寫命令,很是重要,優才網要求本身的學員都要有手寫命令的能力,不能離開phpmyadmin就沒有辦法幹活。

 

SQL上面儘管介紹了這麼多,咱們對它進行一個分類,其實這個分類早有人作了。主要是爲DDL、DML、DCL(固然還有一個TCL,咱們今天不講)。

 

(1)數據定義。(SQL DDL)用於定義SQL模式、基本表、視圖和索引的建立和撤消操做。上面的,大可能是DDL。

(2)數據操縱。(SQL DML)數據操縱分紅數據查詢和數據更新兩類。數據更新又分紅插入、刪除、和修改三種操做。 這就是咱們日常所熟知的增刪改查操做。

(3)數據控制(DCL)。包括對基本表和視圖的受權,完整性規則的描述,事務控制等內容。這個就是咱們上面也有涉及,權限處理。

 

 

2.2 學術性的概念

•一、範式與冗餘

–第一範式,列不能夠分割,好比興趣字段,它裏面,可能寫了籃球、電影等多項。原則上來說,這個表是不知足第一範式的。應該專門創建一個用戶興趣表,有uid和興趣。而後一我的有多條記錄。

      因此在數據庫字段定義時,須要顯式地指明數據類型,除了文本類型以外,你很難往一個字段裏附加多個信息。

 

–第二範式,主鍵決定了其餘所有屬性,好比一個班級學生表,一個學號,決定了學生其餘的信息,好比有一個表,裏面有學號、學院編號、學生姓名、年齡、學院、院長。學號和學院編號是主鍵,看起來沒有錯,學生在這個學院編號裏,決定了哪一個學院,院長是誰誰誰。不過這是不知足第二範式的,由於學院和院長不是由學號這個主鍵來決定的,而是由學院編號來決定的。因此要分拆。

 

–和三範式,其餘屬性全由主鍵決定, 好比仍是上面這個表,裏面有學號、學院編號、學生姓名、年齡、學院、院長。學號是主鍵,看起來沒有錯,學生在這個學院裏,院長是誰誰誰。不過這是不知足第二範式的,由於院長不是由學號這個主鍵來決定的,而是由學院來決定的。因此要分拆。

 

•二、ACID:

–原子性  (Atomicity) , 不可中間失敗。好比說,咱們買東西,一邊是買家付款,從買家帳戶扣除,另外一邊是存錢入賣家帳戶,這分了兩步,這不是原子的。由於可能中間失敗。好比扣錢成功,存錢未成功。

 

–一致性(Consistency),仍是上面這個例子,交易完成後,數據一致,收支相抵。不能一邊多,一邊少。

 

–隔離性(Isolation),避免併發混亂,不少數據,一個客戶訪問時沒有問題,多個用戶在高併發時訪問,也要知足數據不會錯亂。

 

–持久性(Durability),永久保存,就是不要丟失。不能一關機沒有了,即便丟一條也不成。

 

 

2.3 更多高級術語

一、存儲引擎 、事務、複合索引、鏈接池、備份、恢復

二、主從複製、行鎖定、表鎖定、慢查詢、二進制日誌、臨時表、內容分發、同步、數據庫分區、分庫、分表、水平拆分、垂直拆分

這更多的高級術語,咱們在後面再交流,或者在全棧工程師課程中再交流。

 

3、各類數據庫的關係、實踐

3.一、自制簡單文本格式(甚至在PHP中,用數據保存配置)

A、好比有一個AngularJS的示例項目,就用json保存示例數據的格式。

B、PHP保存配置數據就更加常見了,TP就是一個典型。

3.二、文本數據庫(php text db api)

 

咱們從 http://www.c-worker.ch/txtdbapi/index.php#download 下載了這個比較有名的 文本數據庫引擎。

文本數據的使用場景這些交待一下。

一、好比你的虛擬主機,支持PHP,可是不支持MySQL ,也不支持SQLite的時候就能夠發揮用場了。

 

下載了須要修改一下,

txt-db-api.php 的兩個配置。

$API_HOME_DIR=dirname(__FILE__).DIRECTORY_SEPARATOR;    

$DB_DIR=dirname(__FILE__).DIRECTORY_SEPARATOR;

  

經過 http://samples.app.ucai.cn/20140603/phptxtdb/examples/addressbook.php?lang=de&char=M

就能夠看到這個文本數據庫的運行的例子。

而後就能夠看到結果保存了。

果然是文本不是?

     

 

3.三、SQLite 數據庫

SQLite 數據庫也是一個文件數據庫,可是不是文本數據庫。它是一種自有的二進制格式。最先是由C寫的一個庫,而且很早也發佈PHP的訪問擴展,如今通常用的是sqlite3,PHP模塊名也叫sqlite3。

Sqlite 有兩個特色:

一、目前已是很是流行的文件數據庫,尤爲是嵌入式數據庫,在移動應用中也應用得十分廣泛。

二、其訪問的接口同 MySQL的很是地類似。

具體安裝很簡單,就是從官網下了代碼, make 就能夠了,不過代碼可真不是一個小個。

三、SQLite3 已是屬於關係數據庫你們庭的一員,因此它遵循ACID。對於SQL語句的支持也不錯,網上也有人寫了它和SQL互相導入互出的代碼。

也有同MySQL 相似的管理工具,

http://sourceforge.net/projects/sqlitemanager/

 

你們能夠搜索SQLite Manager 就能搜索到一堆。

至於具體的操做,不在這裏展開,咱們五月份的公開課,專門有一講講這個。將會比較詳細地講解SQLite 以及應用。

 

3.四、MySQL 數據庫

 MySQL 從使用上講,你們都比較熟悉了。可是值得注意的是,mysql_query 這樣的方法在php 5.5 時過期。

咱們這裏作三個簡單的例子。分別用即將廢棄的 mysql 和 mysqli 以 PDO 來操做數據庫。

 

第一個例子,是過程式地操做MySQL。用的是很廣泛的數據庫操做函數,也就是php mysql 擴展的函數。這些函數將在 5.5版中過期,因此咱們要抓緊改變了。

 

<?php

 

/**

 * 優才網公開課示例代碼

 *

 * mysql 過程式操做MySQL的例子

 *

 * @author 伍星

 * @see http://www.ucai.cn

 */ 

 

 

$conn = mysql_connect("127.0.0.1", "samples", "ftly5qb");

 

if(!mysql_select_db("samples", $conn))

{

    echo mysql_error();

    exit;

}

// 這應該由用戶提供,下面是一個示例

$name = 'wxstars';

// 構造查詢

// 這是執行 SQL 最好的方式

// 更多例子參見 mysql_real_escape_string()

$query = sprintf("SELECT * FROM users

    WHERE name='%s'",

    mysql_real_escape_string($name));

 

// 執行查詢

$result = mysql_query($query);

 

// 檢查結果

// 下面顯示了實際發送給 MySQL 的查詢,以及出現的錯誤。這對調試頗有幫助。

if (!$result) {

    $message  = 'Invalid query: ' . mysql_error() . "\n";

    $message .= 'Whole query: ' . $query;

    die($message);

}

 

// 結果的使用

// 嘗試 print $result 並不會取出結果資源中的信息

// 因此必須至少使用其中一個 mysql 結果函數

// 參見 mysql_result(), mysql_fetch_array(), mysql_fetch_row() 等。

while ($row = mysql_fetch_assoc($result)) {

    echo $row['id']."\n";

    echo $row['name']."\n";

    echo $row['email']."\n";

}

 

// 釋放關聯結果集的資源

// 在腳本結束的時候會自動進行

mysql_free_result($result);

mysql_close($conn);

?>

  

 

 

第二個例子是過程式和麪向對象的myqli操做數據庫的例子。

<?php

 

/**

 * 優才網公開課示例代碼

 *

 * mysqli 過程式操做MySQL的例子

 *

 * @author 伍星

 * @see http://www.ucai.cn

 */

$mysqli = mysqli_connect("127.0.0.1", "samples", "ftly5qb", "samples", 3306);

 

/* check connection */

if (!$mysqli)

{

    printf("Connect failed: %s\n", mysqli_connect_error());

    exit();

}

// 這應該由用戶提供,下面是一個示例

$name = 'wxstars';

// 構造查詢

// 這是執行 SQL 最好的方式

// 更多例子參見 mysql_real_escape_string()

$query = sprintf("SELECT * FROM users WHERE name='%s'", mysqli_escape_string($mysqli, $name));

 

echo $query;

/* Select queries return a resultset */

if ($result = mysqli_query($mysqli, $query))

{

    printf("Select returned %d rows.\n", mysqli_num_rows($result));

 

 

    $row = mysqli_fetch_assoc($result);

    print_r($row);

    /* free result set */

 

    mysqli_free_result($result);

}

 

mysqli_close($mysqli);

?>

 

<?php

/**

 * 優才網公開課示例代碼

 *

 * mysqli 面向對象操做MySQL的例子

 *

 * @author 伍星

 * @see http://www.ucai.cn

 */ 

 

$mysqli = new mysqli("127.0.0.1", "samples", "ftly5qb", "samples");

 

/* check connection */

if ($mysqli->connect_errno) {

    printf("Connect failed: %s\n", $mysqli->connect_error);

    exit();

}

 // 這應該由用戶提供,下面是一個示例

$name = 'wxstars';

// 構造查詢

// 這是執行 SQL 最好的方式

// 更多例子參見 mysql_real_escape_string()

$query = sprintf("SELECT * FROM users WHERE name='%s'",

    $mysqli->real_escape_string($name));

 

echo $query;

/* Select queries return a resultset */

if ($result = $mysqli->query($query)) {

    printf("Select returned %d rows.\n", $result->num_rows);

 

   

    $row = $result->fetch_assoc();

    print_r($row);

    /* free result set */

   

    $result->close();

}

 

 

$mysqli->close();

?>

 

 

<?php

/**

 * 優才網公開課示例代碼

 *

 * PDO 操做MySQL的例子

 *

 * @author 伍星

 * @see http://www.ucai.cn

 */ 

 

 

/* * * mysql hostname ** */

$hostname = '127.0.0.1';

 

/* * * mysql username ** */

$username = 'samples';

 

/* * * mysql password ** */

$password = 'ftly5qb';

 

try

{

    $dbh = new PDO("mysql:host=$hostname;dbname=samples", $username, $password);

    /*     * * echo a message saying we have connected ** */

    echo 'Connected to database'."\n";

 

    /*     * * The SQL SELECT statement ** */

    $sql = "SELECT * FROM users";

    foreach ($dbh->query($sql) as $row)

    {

        print $row['id'] . ' - ' . $row['name'] . ' - ' . $row['email'] . "\n";

    }

 

    /*     * * close the database connection ** */

    $dbh = null;

} catch (PDOException $e)

{

    echo $e->getMessage();

}

?>

  

 

 

     總結,咱們上面使用了三個不一樣的php 模塊,一個是php mysql,一個是mysqli,一個是 pdo_mysql 三個模塊來分別幹一樣的事情。若是你單獨學習這三個庫,會以爲比較枯燥,當你學到必定程度,融會貫通時,特別是對比學習時發現,你學習了其中一個,學習其餘的也就並不難了。無非就是以下幾步:

一、創建鏈接,在創建 鏈接時須要提交用戶名,密碼,主機,庫名,端口等數據。

二、檢測鏈接是否創建成功。

三、組裝查詢,注意不一樣的模塊,對查詢組裝時的過濾方法也是不一樣的。

四、執行查詢,得到結果句柄,而不是直接的數據。

五、經過很是相近的函數,從結果句柄中取得數據。

六、把數據放到結果句柄裏輸出。

七、在離開程序時,須要釋放結果集資源。

八、在最後,須要關係開啓的數據庫鏈接。

 

3.五、MySQL KVDB的一個插件

爲何要用這個插件,並演示這個插件,有幾個目的。

一,讓你們知道MySQL和KVDB,這些軟件之間,並無明顯的界限,像KVDB的出現,只是它的處理能力更強,而MySQL因爲不少的限制,致使了在簡單的場景下,處理能力並不如KVDB強。並非說不能作。

2、其實有人,將MySQL進行改造,已達到了甚至超過 KVDB的一個高度。就是這個插件所作的,聽說作到了 75萬QPS。而且是生產中可使用的了,一些發行版均將這個模塊包含了進去。

http://yoshinorimatsunobu.blogspot.com/2010/10/using-mysql-as-nosql-story-for.html

 

3、也讓你們瞭解一下MySQL插件的安裝。進一步瞭解MySQL的強大 。

 

https://github.com/DeNA/HandlerSocket-Plugin-for-MySQL

 

wget https://github.com/DeNA/HandlerSocket-Plugin-for-MySQL/archive/master.zip -O HandlerSocket-Plugin-for-MySQL.zip

 

unzip HandlerSocket-Plugin-for-MySQL.zip

 

 進去目錄

cd HandlerSocket-Plugin-for-MySQL-master/

 

sh autogen.sh

 

./configure

  

發現出錯,要求連同mysql 的源碼目錄一塊兒配置。

 

下載了一個5.5版的源碼,配置

 

./configure --with-mysql-source=../MySQL/mysql-5.5.37/

發現出錯。

checking mysql binary... yes: Using /usr/bin/mysql_config, version 5.1.73

configure: error: MySQL source version does not match MySQL binary version

只好查看了一下版本,

[root@localhost HandlerSocket-Plugin-for-MySQL-master]# mysqladmin --version

mysqladmin  Ver 8.42 Distrib 5.1.73, for redhat-linux-gnu on x86_64

 

發現是5.1.73 的版本

因而乎下了一個5.1.73 的源碼。

成功配置,

./configure --with-mysql-source=../MySQL/mysql-5.1.73/

 

而後

make

make install

 

成功安裝。下面再在mysql 中啓用

 

mysql –uroot –p

 

執行 install plugin handlersocket soname 'handlersocket.so'; 安裝插件。

 

插件成功安裝。

再在

/etc/my.cnf 的 [mysqld] 版塊下加入

loose_handlersocket_port    = 9998

loose_handlersocket_port_wr    = 9999

loose_handlersocket_threads    = 4

loose_handlersocket_threads_wr  = 1

loose_handlersocket_address    = [你要監聽的IP地址]

  

而後重啓 mysqld

再show processlist

咱們看到,已經成功運行,再netstat看一眼。

端口監聽成功。

 

說明,此插件在MySQL的另外一個發行版 Percona Server中已包含。

http://www.mysqlperformanceblog.com/2010/12/14/percona-server-now-both-sql-and-nosql/

 

咱們來使用它的 PHP 客戶端來測試一下。

 

下載:

https://code.google.com/p/php-handlersocket/downloads/detail?name=php-handlersocket-0.3.1.tar.gz&can=2&q=

 

安裝模塊。

 

新建測試代碼。

新建表格

create database hstestdb;

 

CREATE TABLE `hstesttbl` (

  `k` int(11) NOT NULL AUTO_INCREMENT,

  `v` char(255) NOT NULL DEFAULT '',

  PRIMARY KEY (`k`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

 

<?php

$host = '101.251.196.91';

$port = 9998;

$port_wr = 9999;

$dbname = 'hstestdb';

$table = 'hstesttbl';

 

//GET

$hs = new HandlerSocket($host, $port);

if (!($hs->openIndex(1, $dbname, $table, HandlerSocket::PRIMARY, 'k,v')))

{

    echo $hs->getError(), PHP_EOL;

    echo "get Error!\n";

    die();

}

 

$retval = $hs->executeSingle(1, '=', array('k1'), 1, 0);

 

var_dump($retval);

 

$retval = $hs->executeMulti(

    array(array(1, '=', array('k1'), 1, 0),

          array(1, '=', array('k2'), 1, 0)));

 

var_dump($retval);

 

unset($hs);

 

 

//UPDATE

$hs = new HandlerSocket($host, $port_wr);

if (!($hs->openIndex(2, $dbname, $table, '', 'v')))

{

    echo $hs->getError(), PHP_EOL;

    die();

}

 

if ($hs->executeUpdate(2, '=', array('k1'), array('V1'), 1, 0) === false)

{

    echo $hs->getError(), PHP_EOL;

    die();

}

 

unset($hs);

 

 

//INSERT

$hs = new HandlerSocket($host, $port_wr);

if (!($hs->openIndex(3, $dbname, $table, '', 'k,v')))

{

    echo $hs->getError(), PHP_EOL;

    die();

}

 

if ($hs->executeInsert(3, array('k2', 'v2')) === false)

{

    echo $hs->getError(), PHP_EOL;

}

if ($hs->executeInsert(3, array('k3', 'v3')) === false)

{

    echo 'A', $hs->getError(), PHP_EOL;

}

if ($hs->executeInsert(3, array('k4', 'v4')) === false)

{

    echo 'B', $hs->getError(), PHP_EOL;

}

 

unset($hs);

 

 

//DELETE

$hs = new HandlerSocket($host, $port_wr);

if (!($hs->openIndex(4, $dbname, $table, '', '')))

{

    echo $hs->getError(), PHP_EOL;

    die();

}

 

if ($hs->executeDelete(4, '=', array('k2')) === false)

{

    echo $hs->getError(), PHP_EOL;

    die();

}

  

3.六、全文檢索

全文檢索是不一個不一樣於數據檢索的領域。有幾個特色:

A、精確的數據庫查詢,不管是在順序,仍是在數據結構上都是很是地肯定的。

B、全文檢索通常面向大數據量,因此查詢結果,在順序上和結果上,都不是須要達到 100%精確,固然也有一些技術指標來衡量向着最好的方向前進。

C、精確查詢所查詢的內容,通常是數字型的比較或者是前置匹配等。

D、全文檢索所查的內容,每每是一段文字中的一個或者多個詞。因此只查文本型的數據。

E、精確查詢每每隨着數據量的記錄數到了必定程度,若是是針對文本的查詢,整個速度會降低比較明顯。

F、而全文檢索通常,隨着數據量的增加,降低不能那麼明顯。

 

全文檢索在PHP中有三種實現方式,一是用MySQL 的MyISAM引擎的全文檢索功能 。二是使用同MySQL結合緊密的 Sphinx。三是使用較爲專業的全文檢索引擎,Lucene。而用Slor來實現量詢。

 

下載solr

wget -c http://mirrors.cnnic.cn/apache/lucene/solr/4.8.1/solr-4.8.1.zip

 

cd solr-4.8.1/example

java –jar start.jar

 

按教程創建好索引:

http://lucene.apache.org/solr/4_8_1/tutorial.html

 

http://101.251.196.91:8983/solr/collection1/select?q=%E6%9C%8D%E5%8A%A1

 

PHP模塊下載:

http://pecl.php.net/package/solr

 

 

<?php

/**

 * 優才網公開課示例代碼

 *

 * Solr 全文檢索客戶端測試

 *

 * @author 伍星

 * @see http://www.ucai.cn

 */ 

 

$options = array

(

    'hostname' => 'localhost',

  //  'login'    => 'username',

  //  'password' => 'password',

    'port'     => '8983',

);

 

$client = new SolrClient($options);

 

$query = new SolrQuery();

 

$query->setQuery('服務器');

 

$query->setStart(0);

 

$query->setRows(50);

 

$query->addField('cat')->addField('features')->addField('id')->addField('timestamp');

 

$query_response = $client->query($query);

 

$response = $query_response->getResponse();

 

print_r($response);

 

?>

4、課程總結

      經過上面的這一節課,咱們站在一個比較高的高度討論了數據庫的出現和應用場景 。其次,從實用和學術兩方面,探討了一些經常使用的術語和概念。第三,就是經過實例,分別講解了不一樣狀況下,對數據庫的不一樣的使用狀況。但願這一講給你們指出一些基本的概念,能讓你們對繼續參與下面的課程有利。

相關文章
相關標籤/搜索