<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>索引 on 老张开工了</title>
    <link>/%E7%B4%A2%E5%BC%95/</link>
    <description>Recent content in 索引 on 老张开工了</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Thu, 13 Feb 2025 10:00:00 +0800</lastBuildDate>
    <atom:link href="/%E7%B4%A2%E5%BC%95/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>索引与性能优化</title>
      <link>/posts/2025/02/index-and-performance/</link>
      <pubDate>Thu, 13 Feb 2025 10:00:00 +0800</pubDate>
      <guid>/posts/2025/02/index-and-performance/</guid>
      <description>数据量达到百万级后，不合适的索引会让查询慢如蜗牛。本章将系统学习 PostgreSQL 的索引原理和性能优化方法。&#xA;为什么需要索引？ 没有索引的查询需要全表扫描——逐行检查数据。就像一本没有目录的书，要找一句话就得从头翻到尾。&#xA;索引的本质是一个排序过的数据结构（B-Tree），让数据库能在 O(log n) 时间内找到数据，而不是 O(n)。&#xA;创建练习数据 -- 创建一张大表来演示索引效果 CREATE TABLE big_orders ( id SERIAL PRIMARY KEY, user_id INTEGER NOT NULL, product_name VARCHAR(100), amount NUMERIC(10,2), status VARCHAR(10), order_date DATE, created_at TIMESTAMP DEFAULT NOW() ); -- 插入 100 万条数据 INSERT INTO big_orders (user_id, product_name, amount, status, order_date) SELECT (random() * 100000)::INT + 1, CASE (random() * 5)::INT WHEN 0 THEN &amp;#39;笔记本电脑&amp;#39; WHEN 1 THEN &amp;#39;手机&amp;#39; WHEN 2 THEN &amp;#39;耳机&amp;#39; WHEN 3 THEN &amp;#39;运动鞋&amp;#39; ELSE &amp;#39;T恤&amp;#39; END, (random() * 5000 + 100)::NUMERIC(10,2), CASE (random() * 4)::INT WHEN 0 THEN &amp;#39;已完成&amp;#39; WHEN 1 THEN &amp;#39;已取消&amp;#39; WHEN 2 THEN &amp;#39;退款中&amp;#39; ELSE &amp;#39;已完成&amp;#39; END, DATE &amp;#39;2024-01-01&amp;#39; + (random() * 730)::INT FROM generate_series(1, 1000000); -- 确认数据已插入 SELECT count(*) FROM big_orders; EXPLAIN 读懂查询计划 -- 查看查询计划 EXPLAIN SELECT * FROM big_orders WHERE user_id = 42; EXPLAIN ANALYZE SELECT * FROM big_orders WHERE user_id = 42; EXPLAIN 输出解读：</description>
    </item>
  </channel>
</rss>
