mysql数据库基础知识
我见过太多人把MySQL当Excel用——建个表,据库基础往里塞数据,知识查询全靠`SELECT *`,据库基础然后抱怨“数据库好难”。知识其实MySQL没那么玄乎,据库基础它就是知识个存东西的仓库,只不过这个仓库规矩多,据库基础你得按它的知识规矩来。规矩是据库基础什么?就是SQL语句。你写对了,知识它给你秒回;写错了,据库基础它甩你一脸错误码。知识
先搞明白最核心的据库基础东西:表。表就是知识那张有行有列的网格,每一列叫字段,据库基础每一行叫记录。比如你建一张用户表,字段就是id、用户名、密码、注册时间。id这东西特别重要,它就像身份证号,每条记录都得有个唯一标识,这叫主键。没主键的表就像没有索引的图书馆,找本书得翻遍整个馆。我见过有人用用户名当主键,结果用户改名的时候整张表都跟着遭殃——用自增的id,省心。
然后说查询。`SELECT`是用的最多的,但别一上来就`SELECT *`。生产环境里,一张表几十个字段,你全查出来,网络带宽和内存都在滴血。要什么查什么,`SELECT name, email`就够了。还有个经典坑:`WHERE`条件里用函数,比如`WHERE YEAR(create_time) = 2024`,这会让索引失效,全表扫描,数据量一大直接卡死。正确做法是`WHERE create_time >= '2024-01-01' AND create_time < '2025-01-01'`,范围查询,索引跑得飞快。
索引这东西,好多人又爱又恨。爱它,因为查询快得像坐火箭;恨它,因为写操作变慢,还占磁盘。我的建议是:别给每个字段都加索引,只给常用的查询条件加。比如订单表里,用户id、订单状态、创建时间,这三个字段经常出现在`WHERE`里,就加联合索引。但注意,联合索引有“最左前缀”原则——你建了(a,b,c)的索引,查询条件里必须有a才能用上,只有b和c的话,索引就废了。这规则像拼积木,左边那块不拼,右边全白搭。
说到表结构,有个反模式我见一次想吐槽一次:把所有东西塞进一个“万能表”里。比如搞个`key_value`表,字段就俩:键和值。看起来灵活,实际上查询要写一堆`CASE WHEN`,数据多了根本没法维护。MySQL是关系型数据库,它的强项就是处理关系。你把关系拆了,那还不如用Redis或者MongoDB。设计表的时候,多想想“这数据属于谁”,用户信息放用户表,订单放订单表,用外键关联——虽然我不建议物理外键,但逻辑上一定要分清楚。
事务这块,最容易出事的场景是转账。A转给B 100块,得先扣A的钱,再加B的钱。这两步必须同时成功或同时失败,不然A的钱没了B没收到,那就乱套了。MySQL的InnoDB引擎支持事务,用`BEGIN`开始,`COMMIT`提交,`ROLLBACK`回滚。记住一句话:事务里别写查询,只写修改操作。查询不进事务,因为读操作不需要保证原子性,写操作才需要。
最后聊个日常操作:备份。我见过有人用`mysqldump`导数据,结果导出来的SQL文件几十GB,恢复的时候跑了俩小时。更靠谱的做法是物理备份,直接复制数据目录,但得用工具锁表,不然数据不一致。我自己的习惯是:每天凌晨全量备份,每小时的binlog增量备份。出问题的时候,全量恢复加binlog回放,能精确到秒级。别嫌麻烦,真出事的时候,你就知道备份有多香了。
MySQL这东西,入门不难,难的是踩过坑之后才懂的那些细节。索引别乱加,查询别乱写,事务别乱用,备份别偷懒。把这四条记心里,你至少能避开80%的日常雷区。剩下的20%?那是你数据量涨到千万级之后才需要考虑的事,到时候你自然会去学分区表、读写分离、分库分表——那是另一个故事了。
