samwellwang

samwellwang

coder
twitter

pgvector

PostgreSQL 是一種開源的關係型資料庫管理系統,它被廣泛用於企業級應用程式和 Web 應用程式。與 MySQL 相比,PostgreSQL 提供了更高級別的功能和更豐富的資料類型。在本文中,我們將介紹 PostgreSQL 的一些重要概念和技巧。

PostgreSQL 與 MySQL 的比較

一個重要的區別是 PostgreSQL 支持插件,而且是開源的。mysql 到目前為止還沒有插件。

Pgvector 插件

Pgvector 插件是一個 PostgreSQL 擴展,它添加了向量類型和向量操作。它可以用於處理文本、圖像和音頻等資料類型。Pgvector 插件可以用於實現相似性搜索和聚類分析等任務。

使用 Pgvector 插件進行向量查詢

要使用 Pgvector 插件進行向量查詢,需要先安裝插件並創建一個向量列。以下是一個創建向量列的示例:

CREATE TABLE product_vectors (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    vector (3) NOT NULL
);

在這個示例中,我們創建了一個名為 product_vectors 的表,其中包含一個名為 vector 的向量列。

要進行向量查詢。以下是一個計算歐氏距離的示例:

SELECT embedding,class_name,file_name,embedding <-> [1.0, 2.0, 3.0] as t FROM image_vector ORDER BY embedding <-> [1.0, 2.0, 3.0] LIMIT 20

在這個示例中,我們使用歐氏距離函數 <-> 計算每個向量與給定向量 '[1.0, 2.0, 3.0]' 之間的歐氏距離。結果按相似度排序。

使用 Pgvector 插件進行聚類分析

要使用 Pgvector 插件進行聚類分析,需要使用 kmeans 函數。以下是一個計算聚類中心的示例:

SELECT kmeans(vector, 3) AS centers
FROM product_vectors;

在這個示例中,我們使用 kmeans 函數將向量分為三個聚類,並計算每個聚類的中心。

單表分區

單表分區是一種將大型表拆分為多個小型表的技術。這可以提高查詢性能,並減少資料備份和恢復時間。在 PostgreSQL 中,可以使用表分區來實現單表分區。感覺上和 mysql 的視圖有點像。

以下是一個創建表分區的示例:

CREATE TABLE sales (
    id SERIAL PRIMARY KEY,
    date DATE NOT NULL,
    amount NUMERIC(10, 2) NOT NULL
) PARTITION BY RANGE (date);

CREATE TABLE sales_2020_01 PARTITION OF sales
    FOR VALUES FROM ('2020-01-01') TO ('2020-02-01');

CREATE TABLE sales_2020_02 PARTITION OF sales
    FOR VALUES FROM ('2020-02-01') TO ('2020-03-01');

在這個示例中,我們創建了一個名為 sales 的表,並將其分為兩個分區:sales_2020_01 和 sales_2020_02。每個分區包含一個特定日期範圍內的資料。

索引的使用

索引是一種加速查詢性能的技術。在 PostgreSQL 中,可以使用 B 樹索引、哈希索引和 GiST 索引等不同類型的索引。

以下是一個創建 B 樹索引的示例:

CREATE INDEX idx_sales_date ON sales (date);

在這個示例中,我們創建了一個名為 idx_sales_date 的 B 樹索引,以加速對 sales 表中日期列的查詢。

其他技巧

除了上述技巧之外,還有許多其他技巧可以提高 PostgreSQL 的性能和功能。以下是一些值得注意的技巧:

  1. 使用連接池來管理資料庫連接。
  2. 使用批量插入來提高插入性能。
  3. 使用 EXPLAIN 命令或者 ANALYZE EXPLAIN 來優化查詢計劃。查詢的結果可以在這個網站得到分析結果這裡
  4. 避免使用 SELECT * 語句。 此處存疑,mysqk 都已經把這個優化了。
  5. 使用合適的資料類型來減少存儲空間。
  6. 定期清理無用資料。
  7. 使用備份和恢復策略來保護資料安全。

結論

在本文中,我們介紹了 PostgreSQL 的一些重要概念和技巧。我們還介紹了 Pgvector 插件、單表分區、索引使用和其他技巧。這些技巧可以幫助您提高 PostgreSQL 的性能和功能,並使其更適合於企業級應用程式和 Web 應用程式。

2021-10-20[]: # Path: MD\blog_ready\pgvector.md#

保存的 SQL draft#

    ---正式用---
CREATE TABLE image_vector_temp (
  id bigserial, 
  file_name varchar, 
  class_name varchar,
  embedding vector,
  PRIMARY KEY (id, class_name)
)PARTITION BY LIST (class_name);

CREATE TABLE image_vector_test_class2 PARTITION OF image_vector_test
  FOR VALUES IN ('class2');
  
select count(*) from image_vector_ma_dama
select *  from image_vector limit 10

select * from image_vector  where file_name = '1fbf05db0869976f9f6681f640e0e93f.jpg'
drop table image_vector_temp

show enable_partition_pruning

---測試用---------

CREATE TABLE image_vector_test (
  id bigserial,
  file_name varchar,
  class_name varchar,
  PRIMARY KEY (id, class_name)
) PARTITION BY LIST (class_name);


CREATE TABLE image_vector_test_class2 PARTITION OF image_vector_test
  FOR VALUES IN ('class2');
  
INSERT INTO image_vector_test (file_name,class_name) VALUES ('abcd','class2')  
  
explain select * from image_vector_test where class_name = 'class2'



EXPLAIN (ANALYZE, VERBOSE, BUFFERS)  SELECT id,file_name,class_name, embedding <-> '此處為face_recogntion生成的123維度的人臉向量'  
show ivfflat.probes
SET ivfflat.probes = 91
SELECT id,file_name,class_name, embedding <-> '此處為face_recogntion生成的123維度的人臉向量'  LIMIT 10 

SHOW max_worker_processes;


SELECT current_setting('max_worker_processes') AS max_worker_processes,
       current_setting('shared_buffers') AS shared_buffers,
       current_setting('effective_cache_size') AS effective_cache_size,
       current_setting('work_mem') AS work_mem,
       current_setting('maintenance_work_mem') AS maintenance_work_mem,
	   current_setting('max_parallel_workers_per_gather') AS max_parallel_workers_per_gather;
	   
SELECT phase, tuples_done, tuples_total FROM pg_stat_progress_create_index;


-- 加index  
CREATE INDEX ON image_vector USING ivfflat (embedding vector_l2_ops) WITH (lists = 8442);


ALTER TABLE image_vector ALTER COLUMN embedding SET DATA TYPE vector(128);
insert into image_vector_temp (file_name,class_name, embedding) values('acv','class1','此處為face_recogntion生成的123維度的人臉向量') 
CREATE TABLE image_vector_temp_class1 PARTITION OF image_vector_temp FOR VALUES IN ('class1')


SELECT id,file_name,class_name, embedding <-> '此處為face_recogntion生成的123維度的人臉向量' limit 20

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。