新聞中心
簡介

隨著互聯(lián)網(wǎng)技術(shù)的發(fā)展,越來越多的網(wǎng)站使用圖片來增強(qiáng)用戶體驗(yàn)。圖片的存儲(chǔ)方式可以分為兩種,一種是將圖片存儲(chǔ)在文件系統(tǒng)中,另一種是將圖片存儲(chǔ)在數(shù)據(jù)庫中。在這篇文章中,我們將探討將圖片存儲(chǔ)在數(shù)據(jù)庫中可能對(duì)性能造成的影響,并提出解決方案。
圖片存儲(chǔ)方式比較
在討論影響數(shù)據(jù)庫性能的問題之前,我們首先需要了解兩種圖片存儲(chǔ)方式的優(yōu)缺點(diǎn)。
1. 文件系統(tǒng)存儲(chǔ)
將圖片存儲(chǔ)在文件系統(tǒng)中是最常見的方式。文件系統(tǒng)存儲(chǔ)僅將圖片的地址存儲(chǔ)在數(shù)據(jù)庫中,而不是圖片的實(shí)際內(nèi)容。例如,將一張圖片上傳到服務(wù)器時(shí),服務(wù)器會(huì)將圖片儲(chǔ)存到硬盤上的某個(gè)目錄中,并在數(shù)據(jù)庫中引用該目錄。文件系統(tǒng)存儲(chǔ)的優(yōu)點(diǎn)如下:
– 空間占用:將圖片存儲(chǔ)在文件系統(tǒng)中會(huì)占用更少的空間,因?yàn)樗恍枰跀?shù)據(jù)庫中引用文件路徑,而不需要將整個(gè)文件存儲(chǔ)在數(shù)據(jù)庫中。
– 性能:將圖片存儲(chǔ)在文件系統(tǒng)中可以提高性能,因?yàn)榇藭r(shí)只需要訪問硬盤上的文件,而不是從數(shù)據(jù)庫中讀取圖片。
2. 數(shù)據(jù)庫存儲(chǔ)
另一種將圖片存儲(chǔ)的方式是將圖片直接儲(chǔ)存在數(shù)據(jù)庫中。數(shù)據(jù)庫存儲(chǔ)的優(yōu)點(diǎn)如下:
– 統(tǒng)一管理:將圖片存儲(chǔ)在數(shù)據(jù)庫中可以統(tǒng)一管理,方便維護(hù)。
– 安全性:將圖片存儲(chǔ)在數(shù)據(jù)庫中可以提高安全性,因?yàn)橹挥惺跈?quán)用戶可以訪問數(shù)據(jù)庫。
圖片存儲(chǔ)方式的比較
影響數(shù)據(jù)庫性能的問題
雖然數(shù)據(jù)庫存儲(chǔ)圖片有其優(yōu)點(diǎn),但這種方法也可能會(huì)對(duì)數(shù)據(jù)庫的性能造成影響。以下是可能的影響:
1. 占用空間
當(dāng)將圖片存儲(chǔ)在數(shù)據(jù)庫中時(shí),每個(gè)圖片都會(huì)使用一定的存儲(chǔ)空間。預(yù)計(jì)存儲(chǔ)大量圖片時(shí),它們將占用大量的存儲(chǔ)空間,從而降低數(shù)據(jù)庫的性能。
2. 讀取速度
將圖片存儲(chǔ)在數(shù)據(jù)庫中時(shí),讀取圖片可能比從文件系統(tǒng)中讀取慢。這是由于需要從數(shù)據(jù)庫中檢索所有與圖像相關(guān)的數(shù)據(jù)。當(dāng)大量的圖片存儲(chǔ)在數(shù)據(jù)庫中時(shí),這會(huì)降低數(shù)據(jù)庫的讀取速度并造成性能問題。
3. 備份和恢復(fù)
在數(shù)據(jù)庫中存儲(chǔ)圖片可能會(huì)使備份和恢復(fù)變得更加困難。數(shù)據(jù)恢復(fù)可能需要更長時(shí)間,相應(yīng)地,數(shù)據(jù)庫備份也可能需要更多的空間和時(shí)間。
解決方案
如果您決定在數(shù)據(jù)庫中存儲(chǔ)圖片,以下是一些解決方案,以避免以上提到的潛在問題:
1. 圖片壓縮
一種解決方案是將圖片壓縮。壓縮圖片可以減少占用的存儲(chǔ)空間,從而提高數(shù)據(jù)庫性能。壓縮時(shí)要注意不要過度壓縮,因?yàn)榇藭r(shí)可能會(huì)降低圖片的質(zhì)量。
2. 圖片緩存
將圖片緩存可以減少從數(shù)據(jù)庫中讀取圖片的次數(shù),并減少對(duì)數(shù)據(jù)庫的請(qǐng)求。緩存可通過內(nèi)存緩存、磁盤緩存和分布式緩存實(shí)現(xiàn)。緩存應(yīng)根據(jù)頁面訪問頻率和緩存時(shí)間進(jìn)行調(diào)整。
3. 分離數(shù)據(jù)庫
將圖片存放在專用的數(shù)據(jù)庫中,以便于管理和維護(hù)。這樣可以將圖片與其他數(shù)據(jù)隔離開來,減少對(duì)其他數(shù)據(jù)的影響,并且能夠?yàn)閿?shù)據(jù)庫管理員提供更好的管理和維護(hù)能力。
結(jié)論
將圖片存儲(chǔ)在數(shù)據(jù)庫中具有一些優(yōu)點(diǎn),例如統(tǒng)一管理和提高安全性。然而,它也可能會(huì)對(duì)數(shù)據(jù)庫的性能造成影響。為避免這些問題,需要對(duì)圖片進(jìn)行壓縮,緩存和將其與其他數(shù)據(jù)隔離開來。這樣可以更大限度地減少對(duì)數(shù)據(jù)庫性能的影響并提高網(wǎng)站的性能。
相關(guān)問題拓展閱讀:
- mysql數(shù)據(jù)庫可以存圖片嗎?
mysql數(shù)據(jù)庫可以存圖片嗎?
mysql數(shù)據(jù)庫是可以存儲(chǔ)圖片的,操作方法:
1、具體的腳本代碼如下,其中我們假定文件上傳域的名稱為Picture;
2、這樣,我們就可以成功的把圖片保存到數(shù)據(jù)庫中。如果在將圖片插入MySQL的過程中出現(xiàn)問題,可以檢查一下MySQL數(shù)據(jù)庫所允許的更大數(shù)據(jù)包的大小。如果設(shè)置值過小的話,我們會(huì)在數(shù)據(jù)庫的錯(cuò)誤日志中找到相應(yīng)的記錄;
3、提取圖片方法:編寫兩個(gè)文件。其中,之一個(gè)文件作為HTML頁面的模板,定位圖片的顯示位置。第二個(gè)文件則被用來從數(shù)據(jù)庫中實(shí)際輸出文件流,作為標(biāo)簽的SRC屬性;
4、當(dāng)HTML頁面被瀏覽時(shí),每顯示一副圖片就會(huì)調(diào)用一次Second.php3文件。當(dāng)?shù)诙€(gè)文件被調(diào)用時(shí)會(huì)傳入相應(yīng)的Picture ID,我們可以借此從數(shù)據(jù)庫中取回對(duì)應(yīng)的圖片并顯示。
在設(shè)計(jì)到數(shù)據(jù)庫的開發(fā)中,難免要將圖片或音頻文件插入到數(shù)據(jù)庫中的情況。一般來說,我們可以同過插入圖片文件相應(yīng)的存儲(chǔ)位置,而不是文件本身,來避免直接向數(shù)據(jù)庫里插入的麻煩。但有些時(shí)候,向MySQL中插入圖片更加容易管理。
背景
MySQL 一直以來都有 TEXT、BLOB 等類型用來存儲(chǔ)圖片、視頻等大對(duì)象信息。比如一張圖片,隨便一張都 5M 以上。視頻也是,隨便一部視頻就是 2G 以上。
假設(shè)用 MySQL 來存放電影視頻等信息,一部是 2G,那么存儲(chǔ) 1000 部就是 2TB,2TB 也就是 1000 條記錄而已,但是對(duì)數(shù)據(jù)庫性能來說,不僅僅是看記錄數(shù)量,更主要的還得看占用磁盤空間大小??臻g大了,所有以前的經(jīng)驗(yàn)啥的都失效了。
所以一般來說存放這類信息,也就是存儲(chǔ)他們的存放路徑,至于文件本身存放在哪里,那這就不是數(shù)據(jù)庫考慮的范疇了。數(shù)據(jù)庫只關(guān)心怎么來的快,怎么來的小。
舉例
雖然不推薦 MySQL 這樣做,但是也得知道 MySQL 該怎么做才行,做到心里有數(shù)。比如下面一張微信圖片,大概 5M 的樣子。
root@ytt:/var/lib/mysql-files# ls -sihl 微信圖片_.jpg.4M -rw-r–r– 1 root root 5.4M Jul 11 07:17 微信圖片_.jpg
拷貝 100 份這樣的圖片來測試
root@ytt:/var/lib/mysql-files# for i in `seq 1 100`; do cp 微信圖片_.jpg “$i”.jpg;done;
root@ytt:/var/lib/mysql-files# ls
100.jpg 17.jpg 25.jpg 33.jpg 41.jpg 4.jpg 58.jpg 66.jpg 74.jpg 82.jpg 90.jpg 99.jpg f8.tsv
10.jpg 18.jpg 26.jpg 34.jpg 42.jpg 50.jpg 59.jpg 67.jpg 75.jpg 83.jpg 91.jpg 9.jpg 微信圖片_.jpg
1111.jpg 19.jpg 27.jpg 35.jpg 43.jpg 51.jpg 5.jpg 68.jpg 76.jpg 84.jpg 92.jpg f1.tsv
11.jpg 1.jpg 28.jpg 36.jpg 44.jpg 52.jpg 60.jpg 69.jpg 77.jpg 85.jpg 93.jpg f2.tsv
12.jpg 20.jpg 29.jpg 37.jpg 45.jpg 53.jpg 61.jpg 6.jpg 78.jpg 86.jpg 94.jpg f3.tsv
13.jpg 21.jpg 2.jpg 38.jpg 46.jpg 54.jpg 62.jpg 70.jpg 79.jpg 87.jpg 95.jpg f4.tsv
14.jpg 22.jpg 30.jpg 39.jpg 47.jpg 55.jpg 63.jpg 71.jpg 7.jpg 88.jpg 96.jpg f5.tsv
15.jpg 23.jpg 31.jpg 3.jpg 48.jpg 56.jpg 64.jpg 72.jpg 80.jpg 89.jpg 97.jpg f6.tsv
16.jpg 24.jpg 32.jpg 40.jpg 49.jpg 57.jpg 65.jpg 73.jpg 81.jpg 8.jpg 98.jpg f7.tsv
我們建三張表,分別用 LONGBLOB、LONGTEXT 和 VARCHAR 來存儲(chǔ)這些圖片信息
mysql> show create table tt_image1G
*************************** 1. row ***************************
Table: tt_image1
Create Table: CREATE TABLE `tt_image1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`image_file` longblob,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
mysql> show create table tt_image2G
*************************** 1. row ***************************
Table: tt_image2
Create Table: CREATE TABLE `tt_image2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`image_file` longtext,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
mysql> show create table tt_image3G
*************************** 1. row ***************************
Table: tt_image3
Create Table: CREATE TABLE `tt_image3` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`image_file` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
我們來給三張表插入 100 張圖片(插入前,建議把 max_allowed_packet 設(shè)置到更大)
tt_image1
root@ytt:/var/lib/mysql-files# for i in `seq 1 100`;
do mysql -S /var/run/mysqld/mysqld.sock -e “insert into ytt.tt_image1(image_file)
values (load_file(‘/var/lib/mysql-files/$i.jpg’))”;done;
tt_image2
root@ytt:/var/lib/mysql-files# for i in `seq 1 100`;
do mysql -S /var/run/mysqld/mysqld.sock -e “insert into ytt.tt_image2(image_file)
values (hex(load_file(‘/var/lib/mysql-files/$i.jpg’)))”;done;
tt_image3
root@ytt:/var/lib/mysql-files# aa=’begin;’;for i in `seq 1 100`;
do aa=$aa”insert into ytt.tt_image3(image_file) values
(‘/var/lib/mysql-files/$i.jpg’);”;
done;aa=$aa’commit;’;mysql -S /var/run/mysqld/mysqld.sock -e “`echo $aa`”;
檢查下三張表記錄數(shù)
mysql> select ‘tt_image1’ as name ,count(*) from tt_image1 union allselect ‘tt_image2’,count(*) from tt_image2 union all select ‘tt_image3’, count(*) from tt_image3;+++| name | count(*) |+++| tt_image1 ||| tt_image2 ||| tt_image3 ||+++3 rows in set (0.00 sec)
看下文件大小,可以看到實(shí)際大小排名,LONGTEXT 字段存儲(chǔ)的更大,LONGBLOB 字段縮小到一半,最小的是存儲(chǔ)圖片路徑的表 tt_image3。所以這里從存儲(chǔ)空間來看,存放路徑最占優(yōu)勢。
root@ytt:/var/lib/mysql/ytt# ls -silhS tt_image*.1G -rw-rmysql mysql 1.1G Jul 11 07:27 tt_image2.ibdM -rw-rmysql mysql 544M Jul 11 07:26 tt_image1.ibdK -rw-rmysql mysql 112K Jul 11 07:27 tt_image3.ibd
那么怎么把圖片取出來呢?
tt_image3 肯定是最容易的
mysql> select * from tt_image3;+—-++| id | image_file |+—-++| 1 | /var/lib/mysql-files/1.jpg |+—-++…100 rows in set (0.00 sec)
tt_image1 直接導(dǎo)出來二進(jìn)制文件即可,下面我寫了個(gè)存儲(chǔ)過程,導(dǎo)出所有圖片。
mysql> DELIMITER $$mysql> USE `ytt`$$mysql> DROP PROCEDURE IF EXISTS `sp_get_image`$$mysql> CREATE DEFINER=`ytt`@`localhost` PROCEDURE `sp_get_image`()mysql> BEGIN DECLARE i,cnt INT DEFAULT 0; SELECT COUNT(*) FROM tt_image1 WHERE 1 INTO cnt; WHILE i DELIMITER ;mysql> call sp_get_image;
tt_image2 類似,把 select 語句里 image_file 變?yōu)?unhex(image_file) 即可。
總結(jié)
這里我舉了個(gè)用 MySQL 來存放圖片的例子,總的來說有以下三點(diǎn):
占用磁盤空間大(這樣會(huì)帶來各種各樣的功能與性能問題,比如備份,寫入,讀取操作等)
使用不易
還是推薦用文件路徑來代替實(shí)際的文件內(nèi)容存放
數(shù)據(jù)庫存圖片會(huì)影響性能嗎的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于數(shù)據(jù)庫存圖片會(huì)影響性能嗎,數(shù)據(jù)庫存儲(chǔ)圖片性能影響分析,mysql數(shù)據(jù)庫可以存圖片嗎?的信息別忘了在本站進(jìn)行查找喔。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊(cè)、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
分享文章:數(shù)據(jù)庫存儲(chǔ)圖片性能影響分析(數(shù)據(jù)庫存圖片會(huì)影響性能嗎)
轉(zhuǎn)載注明:http://m.fisionsoft.com.cn/article/cceccod.html


咨詢
建站咨詢
