目錄
筆記大型項(xiàng)目?jī)?yōu)化概述大型項(xiàng)目?jī)?yōu)化的方向代碼優(yōu)化數(shù)據(jù)庫(kù)優(yōu)化緩存優(yōu)化架構(gòu)優(yōu)化Memcache與MySQL比較語(yǔ)法參數(shù)解釋?zhuān)?/a>增/改鍵(set)獲取鍵值(get)添加鍵數(shù)據(jù)(add)修改鍵數(shù)據(jù)(replace)刪除鍵(delete)刪除所有鍵(flush_all)遞增(incr)和遞減(decr)查看當(dāng)前Memcached運(yùn)行狀態(tài)(stats)PHP操作memcacheMemcache的相關(guān)算法Redis字符串(string)哈希(Hash)列表(List)集合(Set)有序集合(Sorted Set)鍵(Key)Mysql優(yōu)化如何優(yōu)化MySQL三范式(設(shè)計(jì)表的規(guī)則)設(shè)計(jì)表:設(shè)計(jì)表推薦如下字段存儲(chǔ)引擎MyIsam和InnoDB存儲(chǔ)引擎區(qū)別慢查詢?nèi)罩?/a>索引MySQL中的執(zhí)行計(jì)劃分析查詢類(lèi)型(select_type)分析表名(table)分析額外項(xiàng)(extra)分析連接所使用的類(lèi)型(type)索引的使用原則(哪些常見(jiàn)情況不能用索引?)前綴索引limit分頁(yè)優(yōu)化(百萬(wàn)至千萬(wàn)級(jí)快速分頁(yè))分表技術(shù)為什么需要MySQL分表/分區(qū)分區(qū)算法分區(qū)算法介紹分區(qū)語(yǔ)法分區(qū)管理SphinxSphinx使用流程安裝sphinx配置Sphinx創(chuàng)建索引使用PHP API操作Sphinx匹配模式增量索引(Sphinx索引更新)MongoDB概念什么是NoSQL創(chuàng)建MongoDB服務(wù)連接MongoDB服務(wù)器入門(mén)命令庫(kù)和集合操作增刪改查
筆記
大型項(xiàng)目?jī)?yōu)化概述
簡(jiǎn)單理解:讀取源碼-》詞法分析-》創(chuàng)建opcode-》執(zhí)行opcode重復(fù)創(chuàng)建會(huì)增加額外的內(nèi)存和cpu開(kāi)銷(xiāo)
解決方案:安裝ZendOptimizer或APC2.0等可以加速PHP代碼訪問(wèn),主要用于緩存opcode而不是每次重復(fù)編譯減少CPU和內(nèi)存開(kāi)銷(xiāo)(php5.5+后不需要安裝第三方軟件,直接開(kāi)啟PHP配置文件中Opcache即可。
大型項(xiàng)目?jī)?yōu)化的方向
代碼優(yōu)化
開(kāi)啟opcode緩存,減少額外CPU和內(nèi)存開(kāi)銷(xiāo),加快代碼運(yùn)行速度
重模型,輕控制器,減少冗余
符合PHP-FIG規(guī)范和phpDoc規(guī)范,增強(qiáng)代碼可讀性&可擴(kuò)展性,有利于團(tuán)隊(duì)開(kāi)發(fā)
類(lèi): 花括號(hào)獨(dú)占一行
類(lèi)中方法:華括號(hào)獨(dú)占一行
類(lèi)名:大駝峰
方法名:小駝峰
命名空間:后面空一行
常量名:大寫(xiě),多個(gè)單詞用下劃線分割
數(shù)據(jù)庫(kù)優(yōu)化
架構(gòu):主從復(fù)制、讀寫(xiě)分離
設(shè)計(jì):存儲(chǔ)引擎、字段類(lèi)型、三范式
功能:緩存、分區(qū)、索引
緩存優(yōu)化
好處:減少數(shù)據(jù)庫(kù)查詢,將數(shù)據(jù)緩存到文件或內(nèi)存中,加快查詢數(shù)據(jù)
實(shí)現(xiàn):
內(nèi)存(memcache、redis)
文件(使用TP3.2的大S或大F方法,TP5中的Cache類(lèi))
內(nèi)存速度>文件速度>數(shù)據(jù)庫(kù)速度
架構(gòu)優(yōu)化
負(fù)載均衡:將用戶請(qǐng)求分配給多個(gè)服務(wù)器處理(輪詢、ip哈希)
集群:多個(gè)服務(wù)器實(shí)現(xiàn)相同的業(yè)務(wù)
動(dòng)靜分離:將靜態(tài)資源單獨(dú)放一臺(tái)服務(wù)器
主從復(fù)制:insert/update/delete到主服務(wù)器執(zhí)行,所有從服務(wù)器檢測(cè)大主服務(wù)器有寫(xiě)入數(shù)據(jù)則自動(dòng)同步
讀寫(xiě)分離:通過(guò)PHP判斷,如果是insert/update/delete交給主服務(wù)器處理,如果是select交給從服務(wù)器處理
CDN加速:將靜態(tài)資源緩存到用戶所在城市,加快訪問(wèn)速度
Memcache
概念:一個(gè)數(shù)據(jù)庫(kù),但是數(shù)據(jù)存在內(nèi)存中
作用:常用來(lái)做緩存服務(wù)器、將從數(shù)據(jù)庫(kù)查詢的數(shù)據(jù)緩存起來(lái),減少數(shù)據(jù)庫(kù)查詢、加快查詢速度
數(shù)據(jù)存儲(chǔ)在內(nèi)存中系統(tǒng)重啟則丟失
與MySQL比較
共同點(diǎn):都是C/S架構(gòu)
不同點(diǎn):MySQL存磁盤(pán)文件、memcache存在內(nèi)存中
不同點(diǎn):MySQL存儲(chǔ)數(shù)據(jù)要先創(chuàng)建數(shù)據(jù)庫(kù)再創(chuàng)建表、memcache直接以鍵值對(duì)形式存儲(chǔ)
鍵key值value
字符串(唯一)字符串、整數(shù)、浮點(diǎn)數(shù)、布爾、數(shù)組、對(duì)象、NULL、二進(jìn)制數(shù)據(jù)(圖片、視頻、音頻)
語(yǔ)法參數(shù)解釋?zhuān)?/p>
鍵? ? ? - 最大長(zhǎng)度不超過(guò)250字符
是否壓縮? -? 1-是,0-否(以空間換時(shí)間)
緩存時(shí)間? -? 0-理論永久,其他-單位秒(注:最大存儲(chǔ)時(shí)間30天)
數(shù)據(jù)長(zhǎng)度? -? 寫(xiě)數(shù)字,單位字節(jié)(注:回車(chē)輸入具體內(nèi)容)
增/改鍵(set)
語(yǔ)法:set 鍵 是否壓縮? 緩存時(shí)間? 數(shù)據(jù)長(zhǎng)度
說(shuō)明: 鍵存在-則修改,鍵不存在-則創(chuàng)建
獲取鍵值(get)
語(yǔ)法:get 鍵
添加鍵數(shù)據(jù)(add)
語(yǔ)法:add ?鍵 ?是否壓縮 ?緩存時(shí)間/s ?數(shù)據(jù)長(zhǎng)度/字節(jié)?
說(shuō)明:只能添加不能修改
修改鍵數(shù)據(jù)(replace)
語(yǔ)法:replace ?鍵 ?是否壓縮 ?緩存時(shí)間/s ??數(shù)據(jù)長(zhǎng)度/字節(jié)
說(shuō)明:只能修改不能添加
刪除鍵(delete)
語(yǔ)法:delete 鍵
刪除所有鍵(flush_all)
語(yǔ)法:flush_all
遞增(incr)和遞減(decr)
語(yǔ)法:incr? 鍵? 數(shù)字
語(yǔ)法:decr? 鍵? 數(shù)字
說(shuō)明:返回增長(zhǎng)后的結(jié)果,鍵必須存在
查看當(dāng)前Memcached運(yùn)行狀態(tài)(stats)
pid: memcache服務(wù)器進(jìn)程ID
uptime:服務(wù)器已運(yùn)行秒數(shù)
time:服務(wù)器當(dāng)前Unix時(shí)間戳
version:memcache版本
pointer_size:操作系統(tǒng)指針大小
rusage_user:進(jìn)程累計(jì)用戶時(shí)間
rusage_system:進(jìn)程累計(jì)系統(tǒng)時(shí)間
curr_connections:當(dāng)前連接數(shù)量
total_connections:Memcached運(yùn)行以來(lái)連接總數(shù)
connection_structures:Memcached分配的連接結(jié)構(gòu)數(shù)量
cmd_get:get命令請(qǐng)求次數(shù)
cmd_set:set命令請(qǐng)求次數(shù)
cmd_flush:flush命令請(qǐng)求次數(shù)
get_hits:get命令命中次數(shù)
get_misses:get命令未命中次數(shù)
delete_misses:delete命令未命中次數(shù)
delete_hits:delete命令命中次數(shù)
incr_misses:incr命令未命中次數(shù)
incr_hits:incr命令命中次數(shù)
decr_misses:decr命令未命中次數(shù)
decr_hits:decr命令命中次數(shù)
cas_misses:cas命令未命中次數(shù)
cas_hits:cas命令命中次數(shù)
cas_badval:使用擦拭次數(shù)
auth_cmds:認(rèn)證命令處理的次數(shù)
auth_errors:認(rèn)證失敗數(shù)目
bytes_read:讀取總字節(jié)數(shù)
bytes_written:發(fā)送總字節(jié)數(shù)
limit_maxbytes:分配的內(nèi)存總大小(字節(jié))
accepting_conns:服務(wù)器是否達(dá)到過(guò)最大連接(0/1)
listen_disabled_num:失效的監(jiān)聽(tīng)數(shù)
threads:當(dāng)前線程數(shù)
conn_yields:連接操作主動(dòng)放棄數(shù)目
bytes:當(dāng)前存儲(chǔ)占用的字節(jié)數(shù)
curr_items:當(dāng)前存儲(chǔ)的數(shù)據(jù)總數(shù)
total_items:?jiǎn)?dòng)以來(lái)存儲(chǔ)的數(shù)據(jù)總數(shù)(包括過(guò)期的)
evictions:LRU釋放的對(duì)象數(shù)目
reclaimed:已過(guò)期的數(shù)據(jù)條目來(lái)存儲(chǔ)新數(shù)據(jù)的數(shù)目
PHP操作memcache
先開(kāi)啟memcache擴(kuò)展即可
語(yǔ)法:
創(chuàng)建mem對(duì)象:$mem = new Memcache;
連接服務(wù)器:? $mem->connect(服務(wù)ip地址,端口)
關(guān)閉服務(wù)器:? $mem->close();
設(shè)置數(shù)據(jù):? ? $mem->set(鍵,值? [,是否壓縮,緩存時(shí)間])
獲取數(shù)據(jù):? ? $mem->get(鍵)
遞增:? ? ? ? $mem->incrment(鍵,數(shù)字);遞減: ? $mem->decrment(鍵,數(shù)字);
Memcache的相關(guān)算法
惰性過(guò)期機(jī)制
說(shuō)明:memcached內(nèi)部不會(huì)監(jiān)視記錄是否過(guò)期,而是在get時(shí)查看記錄的時(shí)間戳,檢查記錄是否過(guò)期。這種技術(shù)被稱(chēng)為惰性過(guò)期
好處:減少監(jiān)控過(guò)期產(chǎn)生的開(kāi)銷(xiāo)
最近最少使用算法
緩存空間已滿,采用LRU策略,將使用頻率最低數(shù)據(jù)進(jìn)行刪除
Redis
字符串(string)
設(shè)置1個(gè)鍵: set 鍵? 值
設(shè)置n個(gè)鍵:mset 鍵1 值1 .. 鍵n 值n
獲取1個(gè)鍵: get 鍵?
獲取n個(gè)鍵:mget 鍵1 鍵n
遞增遞減: incr/decr 鍵
增減指定: incrby/decrby 鍵 數(shù)字
追加:? ? append 鍵 內(nèi)容
截取: ? substr 鍵 起始位置 結(jié)束位置(注:下標(biāo)從0開(kāi)始,含前含后)
哈希(Hash)
設(shè)置1個(gè)值: hset 鍵 字段? 值
獲取1個(gè)值: hget 鍵 字段?
設(shè)置n個(gè)值:hmset 鍵 字段1 值1 ... 字段n 值n
獲取n個(gè)值:hmget 鍵 字段1 ... 字段n
檢測(cè)字段: hexists 鍵 字段
刪除字段: hdel? 鍵 字段
字段個(gè)數(shù): hlen? 鍵
所有字段: hkeys 鍵
所有值:? hvals 鍵
所有字段值:hgetall 鍵
列表(List)
壓入:lpush/rpush 鍵 值
彈出:lpop/rpop? 鍵
查詢:lrange 鍵 起始位置 結(jié)束位置
集合(Set)
添加:sadd 集合名 數(shù)據(jù)
刪除:srem 集合名 數(shù)據(jù)
查看:smembers 集合名
差集:sdiff 集合名1 ... 集合名n? ? 我有你沒(méi)有
交集:sinter 集合名1 ... 集合名n? 大家都有的
并集:sunion 集合名1 ... 集合名n? 合并去重
有序集合(Sorted Set)
添加:zadd 集合名 數(shù)據(jù) 成員
刪除:zrem 集合名 成員
查看: zrange 集合名 起始位置 結(jié)束位置 [withscores]? ? (升序)
查看: zrevrange 集合名 起始位置 結(jié)束位置 [withscores]? (降序)
鍵(Key)
鍵是否存在:exists 鍵
鍵類(lèi)型: type 鍵
鍵查詢: keys *
鍵更名: rename 舊鍵 新鍵
鍵統(tǒng)計(jì): dbsize
鍵設(shè)置過(guò)期:expire 鍵? 秒數(shù)
查看過(guò)期: ttl 鍵 (明確:過(guò)期則代表不存在,不存在-2,未設(shè)置-1)
選擇數(shù)據(jù)庫(kù):select 下標(biāo)(注:通過(guò)redis.conf聲明數(shù)據(jù)庫(kù)個(gè)數(shù))
刪除當(dāng)前庫(kù):flushdb
刪除所有庫(kù):flushall
Mysql優(yōu)化
如何優(yōu)化MySQL
架構(gòu):主從復(fù)制、讀寫(xiě)分離
設(shè)計(jì):三范式+逆范式、存儲(chǔ)引擎、列類(lèi)型的選擇
功能:索引、緩存、分區(qū)
三范式(設(shè)計(jì)表的規(guī)則)設(shè)計(jì)表:
確保每列/字段保持原子性
有主鍵,且非主鍵字段依賴(lài)主鍵
消除傳遞依賴(lài),非主鍵字段不能相互依賴(lài)
好處:減少冗余,提高表的查詢速度
逆范式:用空間換時(shí)間
設(shè)計(jì)表推薦如下字段
編號(hào)、創(chuàng)建于、更新于、是否刪除
存儲(chǔ)引擎
名詞,指MySQL按照指定數(shù)據(jù)格式存儲(chǔ)
myisam:速度快,但不支持事務(wù)和外鍵約束
innodb:支持事務(wù),行級(jí)鎖定,外鍵約束
archive:只可插入和查詢,不支持刪除和修改
memory:存儲(chǔ)在內(nèi)存,了解
MyIsam和InnoDB存儲(chǔ)引擎區(qū)別
存儲(chǔ)結(jié)構(gòu):myisam - 3個(gè)文件、innodb - 2個(gè)文件
鎖:myisam - 僅支持表鎖,innodb - 行鎖&表鎖
事物和外鍵支持:myisam - 不支持 , innodb? -支持
CURD操作:
?? ? ? ? myisam:大量查詢
?? ? ? ? innodb:大量的插入和修改
全文檢索:僅MySQL5.6以下innodb不支持(都不支持中文)
慢查詢?nèi)罩?/p>
作用:為了防止sql出問(wèn)題,查詢過(guò)慢。
方法:通過(guò)MySQL記錄執(zhí)行較長(zhǎng)的SQL語(yǔ)言
使用如下指令查看慢查詢?nèi)罩臼欠耖_(kāi)啟
showvariableslike'%slow_query%'
沒(méi)開(kāi)啟,就手工開(kāi)啟慢查詢?nèi)罩?/p>
setglobalslow_query_log =1;
設(shè)置查詢的臨界時(shí)間(查詢超過(guò)指定時(shí)間后紀(jì)錄)
showvariableslike'%query_time%';
setgloballong_query_time =2;
使用查詢語(yǔ)句(超時(shí))
insertintophp_slow_log2values('zzzzzz','zzzzzz');
insertintophp_slow_log2(name,name2)selectname,name2fromphp_slow_log2;
驗(yàn)證記錄慢SQL語(yǔ)句,查看日志的記錄
索引
四種索引形式:
普通索引(index)? ? ? ? ? ? ? -? 僅僅為了提高查詢速度
唯一索引(unique)? ? ? ? ? -? 保存數(shù)據(jù)唯一性不能重復(fù)
主鍵索引(primary key)? -? 既保存數(shù)據(jù)唯一又不能為null? ? ? ? 編號(hào)
全文檢索(fulltext) ? -? 提取關(guān)鍵字添加索引(明天詳細(xì)說(shuō))? like
組合索引(index) ? -? 給多個(gè)字段添加相同的索引
? 新建表時(shí)添加索引:
修改表時(shí)添加索引或者刪除索引
修改表添加索引:alter table 表名 add 索引類(lèi)型? 索引名(字段)
刪除表指定索引:drop? index? 索引名 on 表名
MySQL中的執(zhí)行計(jì)劃
就是通過(guò)explain語(yǔ)法分析SQL語(yǔ)句
語(yǔ)法:explain? SQL語(yǔ)句 \G
說(shuō)明:\G后面不要加分號(hào)
字段類(lèi)型含義
select_type查詢類(lèi)型
table表名
type連接類(lèi)型
possible_keys可能用到的索引
key實(shí)際用到索引
key_len索引長(zhǎng)度
rows檢索了多少數(shù)據(jù),最終顯示結(jié)果
分析查詢類(lèi)型(select_type)
simple:不含子查詢
primary:含子查詢或派生查詢
subquery :非from子查詢
derived:from型子查詢
union
union result
分析表名(table)
實(shí)際表名
表別名
derived(from型子查詢)
null
分析額外項(xiàng)(extra)
index:是指用到了索引覆蓋,效率非常高
using where:是指光靠索引定位不了,還得where判斷一下
extra中出現(xiàn)以下2項(xiàng)意味著MySQL根本不能使用索引,效率會(huì)受到重大影響,應(yīng)盡可能對(duì)此進(jìn)行優(yōu)化
using temporary:表示 MySQL 在對(duì)查詢結(jié)果排序時(shí)使用臨時(shí)表。常見(jiàn)于排序 order by 和分組查詢 group by
using filesort:表示 MySQL 會(huì)對(duì)結(jié)果使用一個(gè)外部索引排序,而不是從表里按索引次序讀到相關(guān)內(nèi)容。可能在內(nèi)存或者磁盤(pán)上進(jìn)行排序。MySQL 中無(wú)法利用索引完成的排序操作稱(chēng)為“文件排序”
分析連接所使用的類(lèi)型(type)
最好的是? system? 一般在表中只有一行記錄的或者查詢系統(tǒng)表的時(shí)候出現(xiàn)。
其次就是 const? ? ? 一般在使用主鍵索引的時(shí)候會(huì)出現(xiàn)。
其其次 range? ? ? ? ? 一般在做范圍查詢的時(shí)候會(huì)使用 id < 100。
index? ? ? ? ? ? ? ? ? 代表可以使用索引做一些優(yōu)化,一般在查詢表的總行數(shù)的時(shí)候出現(xiàn)。
all? ? ? ? ? ? ? ? ? ? ? 一般使用不上索引的時(shí)候出現(xiàn)。
. ref 意思是指 通過(guò)索引列,可以直接引用到某些數(shù)據(jù)行. eq_ref 意思是指 通過(guò)索引列,可以直接引用某1行數(shù)據(jù)
索引的使用原則(哪些常見(jiàn)情況不能用索引?)
說(shuō)明:
like查詢(“%”和“_”開(kāi)頭)索引失效
or運(yùn)算都要具有索引,否則索引失效
where條件字段是字符串類(lèi)型必須加引號(hào)
組合索引字段單獨(dú)使用,左邊生效,右邊失效(左原則)
前綴索引
概念:就是給字段內(nèi)容前n個(gè)字符添加索引(前n個(gè)字符必須具備唯一性)
好處:加快查詢速度
語(yǔ)法:
altertable表名add索引類(lèi)型 索引名(字段(字符))
limit分頁(yè)優(yōu)化(百萬(wàn)至千萬(wàn)級(jí)快速分頁(yè))
由于數(shù)據(jù)量大超過(guò)一定頁(yè)后SQL語(yǔ)句查詢慢
問(wèn)題分析:如果只想查詢最后的5條數(shù)據(jù),但是一般查詢限制會(huì)查詢所有數(shù)據(jù),所以效率極低
解決方法:
從業(yè)務(wù)角度(百度、谷歌),限制頁(yè)面展示的數(shù)量
從索引角度
以前是通過(guò)SQL語(yǔ)句限制數(shù)據(jù),會(huì)過(guò)濾全部數(shù)據(jù)
通過(guò)id或者其它條件過(guò)濾,避免不必要的性能影響
分表技術(shù)
水平分表
當(dāng)一個(gè)表很大時(shí)我們創(chuàng)建索引后,查詢速度還是很慢,把一個(gè)大表按照某個(gè)標(biāo)準(zhǔn)分割成小表,這樣可以提高查詢的速度
(用戶ID)%(表個(gè)數(shù)),再通過(guò)取余出來(lái)的結(jié)果排序
垂直分表
一個(gè)表有很多字段,查詢慢。可以通過(guò)區(qū)分常用字段和不常用字段
為什么需要MySQL分表/分區(qū)
水平分表或分區(qū),都是為了加快查詢速度
水平分表需要手動(dòng)在應(yīng)用層寫(xiě)邏輯代碼,但是通過(guò)分區(qū)可以避免,由MySQL底層實(shí)現(xiàn),我們只需要寫(xiě)原生SQL語(yǔ)句
分區(qū)算法
分區(qū)算法介紹
求余(主鍵字段):key求余算法、hash算法
條件:list-數(shù)據(jù)必須在指定集合中,range-數(shù)據(jù)在執(zhí)行范圍中
分區(qū)語(yǔ)法
createtable表名名(
)engine=存儲(chǔ)引擎charset=編號(hào)
partitionby算法名(字段)partitions數(shù)字;
分區(qū)管理
取余管理:增加分區(qū)-不影響原數(shù)據(jù),刪除分區(qū)-不影響原數(shù)據(jù)
條件管理:增加分區(qū)-不影響原數(shù)據(jù),刪除分區(qū)-數(shù)據(jù)丟失
取余管理(key,hash)
增加分區(qū)數(shù)量:alter table 表名 add partition partitions 數(shù)字
減小分區(qū)數(shù)量:alter table 表名 coalesce partition 數(shù)字
條件管理(list,range)
刪除分區(qū):alter table 表名 drop partition 分區(qū)名
添加分區(qū):
Sphinx
一個(gè)軟件,用來(lái)代替MySQL全文檢索
特性:(強(qiáng)、快)
高速的建立索引(峰值性能能達(dá)10M/s)
高性能的搜索(在2-4G的文本數(shù)據(jù)上,平均每次檢索時(shí)間小于0.1秒)
可處理海量數(shù)據(jù)
優(yōu)勢(shì)
Sphinx單一索引最大可包含1億條記錄,在1千萬(wàn)條記錄情況下的查詢速度為0.x秒(毫秒級(jí))
Sphinx創(chuàng)建索引的速度為:創(chuàng)建100萬(wàn)條記錄的索引只需3~4分鐘,創(chuàng)建1000萬(wàn)條記錄的索引可以在50分鐘內(nèi)完成,而只包含最新10萬(wàn)條記錄的增量索引,重建一次只需幾十秒
Sphinx使用流程
通過(guò)sphinx去MySQL中獲取并建立索引文件
通過(guò)php去sphinx中查詢數(shù)據(jù)并返回ID
根據(jù)ID去MySQL中查詢具體數(shù)據(jù)
安裝sphinx
配置Sphinx
創(chuàng)建數(shù)據(jù)庫(kù)
將etc/csft_mysql.conf復(fù)制并更名為sphinx.conf
復(fù)制下面代碼替換shpinx.conf中的內(nèi)容(紅色-可能需要修改,綠色-存在對(duì)應(yīng)關(guān)系)
#數(shù)據(jù)源:數(shù)據(jù)來(lái)源定義(數(shù)據(jù)庫(kù)信息、數(shù)據(jù)源SQL語(yǔ)句)
source music
{
?? #下面是sql數(shù)據(jù)庫(kù)特有的端口,用戶名,密碼,數(shù)據(jù)庫(kù)名等。
?? type ? ? ? ? ? ? ? ? ?? = mysql
?
?? sql_host ? ? ? ? ? ? ?? = localhost
?? sql_user ? ? ? ? ? ? ?? = root
?? sql_pass ? ? ? ? ? ? ?? = admin
?? sql_db ? ? ? ? ? ? ? ?? = youhua3
?? sql_port ? ? ? ? ? ? ?? = 3306
?? sql_query_pre ? ? ? ? ? = SET NAMES utf8
?
?? #sql_query屬性:取出要?jiǎng)?chuàng)建索引的數(shù)據(jù)
?? #要求1:SELECT的第一個(gè)字段必須是主鍵、
?? #要求2:第一個(gè)字段的名字(別名)必須是id
?? #要求3:其他的字段就是要?jiǎng)?chuàng)建索引的字段
?? #需? 求:為歌曲表中的title和author和content字段創(chuàng)建索引
?? sql_query ? ? ? ? ? ? ? = SELECT id, title, author, content FROM music
}
?
#索引的定義(索引文件存放的位置,索引文件的名字)
#每個(gè)index對(duì)應(yīng)一個(gè)數(shù)據(jù)源,用來(lái)定義這個(gè)數(shù)據(jù)源生成的索引文件的信息
index music
{
?? #該索引對(duì)應(yīng)哪個(gè)數(shù)據(jù)源
?? source ? ? ? ? ?? = music
?? #索引文件存放的目錄和名字(存到E:/sphinx/var/data/目錄下,索引文件的名字是music)
?? path ? ? ? ? ? ?? = E:/sphinx/var/data/music ?
?? docinfo ? ? ? ? ? = extern
?? mlock ? ? ? ? ? ? = 0
?? morphology ? ? ?? = none
?? min_word_len ? ?? = 1
?? html_strip ? ? ?? = 0
?? #詞庫(kù)文件所在的目錄
?? charset_dictpath = E:/sphinx/etc/
?
#字符集編碼類(lèi)型,可以為:(sbcs,utf-8,zh_cn.utf-8,zh_ch.gbk,zh_ch.big5)
?? charset_type ? ? ?? = zh_cn.utf-8
}
?
#全局index定義
indexer
{
?? #建立索引的時(shí)候,索引內(nèi)存限制
?? mem_limit ? ? ? ? ?? = 128M
}
?
#searchd服務(wù)定義
searchd
{
?? listen ? ? ? ? ? ?? = ? 9312
?? read_timeout ? ? ?? = 5
?? max_children ? ? ?? = 30
?? max_matches ? ? ? ? = 1000
?? seamless_rotate ? ? = 0
?? preopen_indexes ? ? = 0
?? unlink_old ? ? ? ?? = 1
?? # 進(jìn)程id文件
?? pid_file = E:/sphinx/var/log/searchd_mysql.pid ?
?? # 系統(tǒng)日志存放的位置
?? log = E:/sphinx/var/log/searchd_mysql.log ? ? ? ?
?? # 查詢?nèi)罩敬娣诺奈恢?/p>
?? query_log = E:/sphinx/var/log/query_mysql.log
}
index music? ? 創(chuàng)建music索引(和source一一對(duì)應(yīng),表示該索引通過(guò)哪些數(shù)據(jù)創(chuàng)建)
source music1? 創(chuàng)建music數(shù)據(jù)源
創(chuàng)建索引
創(chuàng)建指定索引語(yǔ)法:indexer.exe? -c 配置文件? 索引名
創(chuàng)建全部索引語(yǔ)法:indexer.exe? -c 配置文件? --all
使用PHP API操作Sphinx
創(chuàng)建服務(wù):bin\searchd.exe? -c 配置文件 --install
刪除服務(wù):sc delete 服務(wù)名
啟動(dòng)服務(wù):net start 服務(wù)名
關(guān)閉服務(wù):net stop? 服務(wù)名
匹配模式
$sp->SetMatchMode(常量)
常量規(guī)則
SPH_MATCH_ALL? ? ? ? ? 匹配所有詞(默認(rèn))SPH_MATCH_ANY ? ? ? ? 匹配一個(gè)詞
SPH_MATCH_PHRASE? ? ? 匹配整一個(gè)詞
SPH_MATCH_BOOLEAN? 將查詢看作一個(gè)布爾表達(dá)式
SPH_MATCH_EXTENDED? 查詢看做一個(gè)sphinx的表達(dá)式
將sphinx的結(jié)果轉(zhuǎn)化為具體的信息
通過(guò)sphinx去mysql中獲取數(shù)據(jù)并建立索引文件
通過(guò)php去sphinx匹配數(shù)據(jù)ID
根據(jù)ID去數(shù)據(jù)庫(kù)中查詢數(shù)據(jù)
增量索引(Sphinx索引更新)
概念:更新sphinx索引文件的表現(xiàn)稱(chēng)之為增量索引
語(yǔ)法:
創(chuàng)建索引語(yǔ)法:indexer? -c? 配置文件? 索引名
合并索引語(yǔ)法:indexer? -c? 配置文件? --merge 主索引名 新索引名 --rotate
MongoDB