编程入门必学:数据库操作极简教程,一看就懂

阿木 发布于 22 小时前 1 次阅读


学完数据库基础后,却发觉面试老是被卡住,你所欠缺的并非死记硬背,而是那种能将零散知识点串联构建成一套体系的能力,下面这一套从收藏夹直至生产系统的进阶路线,会助力你切实弄明白数据库究竟该如何运用。

从收藏夹到数据表

许多人觉得Excel便是数据库,这样的认知仅仅对了一部分。在2025年由Stack Overflow所做的调查表明,百分之七十八的企业系统依旧在运用关系型数据库,然而其早已并非仅仅是存储个人歌单那般简易。就拿淘宝后台处理订单来说,每一秒都要进行数万条数据的读写操作,仅仅依靠单一表格是根本无法承受的。

事实上专业的做法是进行拆表存储,就拿音乐App来说,歌手表存储艺人编号以及姓名,专辑表存储唱片相关信息,歌曲表则关联两者的ID,这样的设计能够避免数据冗余,也就是说你不必在每首歌的记录当中重复书写“皇后乐队”的全名 根据2024年字节跳动公开课所讲,合理地拆表能够为企业节省超过30%的存储成本。

两种数据库的适用边界

要抉择是选MySQL还是MongoDB,重点在于看业务场景,关系型数据库在一致性方面表现突出,像银行转账、机票预订这类容错率低的操作必定得用它,非关系型数据库在灵活扩展方面占优势,比如微信朋友圈的点赞记录,每日有几亿条写入,采用Redis缓存更划算。

CREATE DATABASE MyMusicCollection; -- 创建一个新的数据库
USE MyMusicCollection; -- 选择这个数据库
CREATE TABLE Music ( -- 创建一个新的表格
    ID int NOT NULL AUTO_INCREMENT,
    Artist varchar(255),
    Album varchar(255),
    Song varchar(255),
    Release_Year int,
    PRIMARY KEY (ID)
);
INSERT INTO Music (Artist, Album, Song, Release_Year) 
VALUES ('Queen', 'Greatest Hits', 'Bohemian Rhapsody', 1981); -- 添加一首歌
SELECT * FROM Music; -- 展示所有歌曲

存在一个真实的案例,在2023年的时候,某生鲜电商处于高峰期,订单数量急剧暴涨,MySQL承受不住写入所带来的压力,技术团队临时在商品详情页面添加了Redis缓存,页面加载的速度从3秒降低到了0.5秒,然而核心支付环节依旧保留在MySQL,因为没有人愿意看到出现扣款成功却显示“未支付”这样的纠纷。

SQL语句的隐形陷阱

新手极易犯下的错乃是滥用DELETE,假定你打算将“皇后乐队”的所有歌曲删除,径直执行WHERE Artist=‘Queen’的话,或许错误删除了同名艺人的数据,正确的做法是先对Artist ID进行查询确认,或者增添软删除字段来标记状态,2022年GitLab出现过删库的事故,那正是由一条未加限制的DELETE语句所引发的。

SELECT Tracks.TrackName, Albums.AlbumName
FROM Tracks
INNER JOIN Albums ON Tracks.AlbumID = Albums.AlbumID;

2024年,有一位身处跨境电商领域的运营人员,打算给全部商品提升价格百分之十,却因WHERE条件遗漏 使得整个库存单价变为两倍,在半小时内造成了两百万的损失,而UPDATE语句同样存在危险性。行业里的严格准则指明,在生产环境内执行修改型SQL之前,一定要先进行备份操作,并且运用SELECT去验证条件范围。

SELECT AlbumName
FROM Albums
WHERE AlbumID IN (SELECT AlbumID FROM Tracks GROUP BY AlbumID HAVING COUNT(TrackID) > 10);

索引不是越多越好

索引的确能够起到提速的作用,然而要是建得过多,反倒会使写入性能受到拖垮。举例来说,以社交平台的用户状态更新表为例,每当发布动态的时候,需要同时对内容、时间戳以及位置这三个索引进行更新。在2025年的时候,某短视频平台披露,在他们的性能调优工作当中,有40%的工作内容是删除那些毫无用处有索引。

CREATE PROCEDURE CountTracks()
BEGIN
  SELECT COUNT(*) FROM Tracks;
END;

究竟该如何进行取舍呢?那是由查询频率来决定一切的。就好比音乐库当中的歌曲名称,每一次进行搜索的时候都需要用到,所以必须要建立索引;然而购买日期仅仅只是在财务对账的时候查询一次,那完全是没有必要建立索引的。要记住这样一个原则:索引是为高频查询提供服务的,并非是用来给所有字段发放通行证的。

存储过程和触发器的现代应用

CREATE TRIGGER IncreaseTrackCount
AFTER INSERT ON Tracks
FOR EACH ROW
  UPDATE Albums SET TrackCount = TrackCount + 1 WHERE AlbumID = NEW.AlbumID;

十年之前的时候,存储过程是颇为流行的,然而到了现在,大厂却会谨慎地去使用它。这是因业务逻辑被写在了数据库里,版本管理会麻烦些,迁移成本也是比较高的,而不过在某些场景当中依旧是属于刚需的,就好比银行月底进行计息的时候,几千行的计算运用存储过程来跑,会比应用层代码快3倍还要多。

更适宜自动化监控的是触发器,在2024年时,有某物流公司借助触发器达成异常预警,即当运输表存有“温度超过 -18℃”的记录之际,会自动去插入审计日志,并且推送报警,这样的场景无需人工进行干预,由数据库自行形成闭环是最为可靠的。

CREATE INDEX idx_AlbumName
ON Albums (AlbumName);

事务和锁的实战思维

即便将ACID原则背诵得极为熟练,也比不上对死锁如何解决的理解。在2023年双十一期间,某电商的库存系统出现了大量超卖的情况,经过排查发现,是在高并发的状况下,两个事务彼此持有对方所需要的锁。最终的方案是,将更新语句统一按照商品ID升序来执行,死锁率下降了99%。

隔离开的级别之中,也并非是毫无头脑地去选择可重复这份读取。就好比内容方面的推荐系统,允许了不多的一些脏读现象存在,通过采用读已经提交的情况,能够显著增强那般并发。美团进行的实践中分享过,不是金融类型的业务,采用更低的一些隔离开级别,数据库整体所产生的吞吐量能够提升百分之二十五。

你可曾有过自身所撰写的SQL致使数据库运行速度减慢的经历呀?那时又是怎样寻觅到问题根源的呢?诚邀在评论区分享你的排查经过。凡有用的经验皆值得被更多人瞧见。

START TRANSACTION;
UPDATE Accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE Accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT;