索引应精准匹配where和join字段组合,联合索引需按等值在前、范围在后顺序创建;select * 影响索引覆盖,应明确字段;外键重在一致性而非性能;varchar长度影响内存分配,text索引受限;务必用explain验证索引是否生效。

索引不是加得越多越好,而是要匹配 WHERE 和 JOIN 的字段组合
查得慢,第一反应加索引,但加错位置反而拖慢写入、浪费空间,甚至让优化器选错执行计划。关键看查询实际走哪几个字段过滤或关联。
-
WHERE status = ? AND created_at > ?—— 单独给status或单独给created_at效果有限,应建联合索引(status, created_at),顺序不能反(等值条件在前,范围条件在后) -
JOIN orders ON users.id = orders.user_id——orders.user_id必须有索引,users.id通常是主键,自动有索引 - 对
ORDER BY字段加索引只在同时带LIMIT且无WHERE时才大概率生效;否则优先保证过滤字段覆盖
SELECT * 在大表上是性能隐形杀手
不只是带宽和内存问题,更影响索引覆盖:只要查询能走覆盖索引(所有字段都在索引里),就不用回表查数据行,速度可能差一个数量级。
使用模板与程序分离的方式构建,依靠专门设计的数据库操作类实现数据库存取,具有专有错误处理模块,通过 Email 实时报告数据库错误,除具有满足购物需要的全部功能外,成新商城购物系统还对购物系统体系做了丰富的扩展,全新设计的搜索功能,自定义成新商城购物系统代码功能代码已经全面优化,杜绝SQL注入漏洞前台测试用户名:admin密码:admin888后台管理员名:admin密码:admin888
- 把
SELECT *改成明确列出需要的字段,比如SELECT id, name, email - 如果常查
user_id, order_time, amount,且数据量大,考虑建覆盖索引:CREATE INDEX idx_orders_cover ON orders (user_id, order_time) INCLUDE (amount)(PostgreSQL 11+,SQL Server 支持INCLUDE;MySQL 需把字段全放进索引列) - ORM 自动生成
SELECT *时尤其危险——确认它没在分页或统计场景下拉整张宽表
外键约束不等于查询加速,还可能锁表
外键主要保数据一致性,不是为提升查询速度。反而在高并发更新子表时,数据库要检查父表是否存在对应记录,可能触发共享锁,卡住其他操作。
- 读多写少、强一致要求高的场景(如金融核心账务),保留外键合理
- 日志类、报表类、分析型表(
event_log,fact_sales),通常关掉外键,靠应用层或 ETL 保证逻辑正确 - MySQL 中,外键会强制在父表上加
SELECT ... LOCK IN SHARE MODE,若父表被频繁更新,子表插入就会排队
字符串字段用 VARCHAR 还是 TEXT?长度定义真会影响性能
表面上只是类型区别,实际关系到行存储方式、排序行为、索引限制和内存临时表使用。
- MySQL 中,
VARCHAR(255)和VARCHAR(1000)在磁盘存储上没差别(按实际长度存),但排序或 GROUP BY 时,会按定义长度分配内存;定义过大容易触发磁盘临时表 -
TEXT字段不能直接建全文索引以外的常规索引(除非指定前缀长度,如INDEX(title(191))),且无法作为PRIMARY KEY或参与某些 JOIN 条件优化 - PostgreSQL 对
TEXT和VARCHAR几乎无区别,但习惯上仍用TEXT存不定长内容,VARCHAR(n)仅当业务强校验长度(如手机号固定 11 位)
EXPLAIN 输出里的 key 和 rows,而不是“我加了索引”这个动作本身。










