1. MySQL引擎:选错直接GG
土豆哥总结:引擎就是车的发动机,你开五菱宏光还想飙车?
-
InnoDB(推荐の神)
-
特点:支持事务(转账必须用它!)、行级锁(你锁一行,别人还能改其他行,不打架)、外键(搞关系必备)。
-
缺点:比MyISAM占硬盘,但2025年了,硬盘不值钱,别抠!
-
适用场景:99%的情况无脑选它,尤其是有钱的系统(比如你老板的电商后台)。
-
-
MyISAM(过气网红)
-
特点:表级锁(锁整张表,一锁全卡死)、不支持事务(删库跑路专用?)、读快写慢。
-
经典翻车现场:高并发写入时直接卡成PPT,比如抢购系统用MyISAM?等着被老板祭天吧!
-
苟延残喘场景:只读的数据(比如你写的垃圾毕设项目)。
-
2. 索引:查询加速の奥义
土豆老哥暴论:没索引?数据库就是坨屎山!
(1)聚簇索引(InnoDBの亲儿子)
-
土味解释:数据直接按索引顺序存!主键就是聚簇索引(没有主键?MySQL偷偷给你生成一个隐藏的)。
-
例子:你家的新华字典,目录是拼音,内容按拼音顺序排,查拼音直接翻到页数,数据和索引在一起!
-
优点:主键查询快到飞起(比如
WHERE id=666
)。 -
坑爹细节:
-
主键别用UUID!否则数据插得东一坨西一坨,查询慢到裂开(想象字典每页随机乱序)。
-
用自增整数当主键,那数据就跟排队似的,一个接一个整整齐齐地往后排。你查的时候,就顺着这排好的队伍一路找,轻轻松松就找到你要的那一条,效率杠杠的。
-
数据库里数据插得东一块西一块,查询的时候数据库就得在磁盘里这儿找找那儿翻翻,就跟在一堆乱麻里找线头似的,能不慢到裂开吗?
-
主键最好是自增整数,省事又高效(比如
id INT AUTO_INCREMENT
)。
-
(2)非聚簇索引(MyISAMの绝活,InnoDB也支持)
-
土味解释:索引和数据分家!索引里存的是数据的地址(类似门牌号)。
-
例子:你家的新华字典,目录是偏旁部首,但内容还是按拼音排,查偏旁要先翻目录找到页数,再跳过去,多一次跳转!
-
优点:可以建多个索引(比如名字、手机号都能建)。
-
坑爹细节:
-
回表查询:比如你按手机号查用户,先查索引拿到主键id,再用id查数据,多一步操作,慢!
-
回表查询得先在索引里找到主键 id,再用 id 去查数据,多一步操作,慢得很。
-
覆盖索引能救命:如果索引里直接有你要的数据(比如
SELECT phone FROM user WHERE phone='138xxx'
),不用回表,直接起飞! -
比如说你有个用户表,里面有姓名、手机号、身份证号啥的。你建了个手机号的索引,然后你写个查询语句
SELECT phone FROM user WHERE phone='138xxx'
,你看啊,你要查的就只是手机号,而你建的手机号索引里刚好就有手机号这个信息。但用了覆盖索引,直接从索引里拿到你要的结果,就不用回表了,这速度,那必须是直接起飞啊,咔咔的!所以碰到合适的情况,一定要整覆盖索引,能省老多事儿了!
-
3. 灵魂对比
对比项 | 聚簇索引(InnoDB) | 非聚簇索引(MyISAM) |
---|---|---|
数据存储 | 按主键排,数据和索引在一起 | 数据随便堆,索引单独存地址 |
查询速度 | 主键查询直接秒 | 主键查询也得跳转两次 |
插入速度 | 主键自增时快,乱序插入慢 | 直接往文件末尾插,快 |
适用场景 | 高并发事务系统 | 读多写少的古董系统 |
4. 土豆哥の祖传忠告
-
索引不是越多越好!乱建索引等于往硬盘里塞垃圾,插入慢成狗。
-
联合索引注意最左匹配!比如索引
(a,b,c)
,你查WHERE b=1 AND c=2
,卵用没有! -
EXPLAIN命令永远的神!不会优化SQL?
EXPLAIN
一下,直接看有没有走索引! -
长字段建前缀索引!比如
varchar(255)
的字段,取前20字符建索引,省硬盘!
总结:
-
InnoDB选爆,主键用自增,索引别乱加,SQL用EXPLAIN!
-
再记不住?把这帖子打印贴工位上,同事问起就说“土豆哥教的,稳!”