SQLite与MySQL查找指定表的机制:表是否有直接引用?
嘿,作为编程新手能自己捣鼓出安卓工时记录应用,已经超棒啦!针对你问的SQLite和MySQL的表引用、查找机制问题,我来给你唠唠清楚:
1. 创建表后的引用问题
当你在SQLite里创建完表之后,数据库会自动在**系统表sqlite_master**中存储这个表的元数据(比如表名、创建语句、存储类型等),这相当于数据库内部给表建立了一个“登记信息”。
对你的代码来说,不需要什么特殊的“引用对象”,只要你记得表名,直接写SQL语句(比如INSERT INTO work_hours (...) VALUES (...))就能操作它——SQLite会通过sqlite_master快速确认表的存在和结构,不用你手动维护内存里的引用。
你可以自己验证下,执行这条SQL就能查到所有用户创建的表:
SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%';
2. 查找指定表的方式
SQLite查找指定表的时候不是遍历所有表,而是直接查询sqlite_master这个系统表。sqlite_master本身是经过优化的,对表名这类字段有索引,所以能快速定位到你要找的表的元数据,确认表存在后就直接访问对应的数据存储区域,效率很高。
举个例子,当你执行SELECT * FROM work_hours;时,SQLite第一步会去sqlite_master里查有没有叫work_hours的表,找到后就直接读取该表的数据,不会挨个遍历数据库里的所有表。
1. 创建表后的引用问题
MySQL的逻辑和SQLite类似,但元数据存储的位置不一样:创建表后,表的信息会存在系统库information_schema的TABLES表里,同时不同存储引擎(比如常用的InnoDB)会有自己的表空间文件来存储表数据和结构。
同样,你的代码里操作表只需要用数据库名.表名(比如INSERT INTO my_app.work_hours (...) VALUES (...)),或者先执行USE my_app;再直接用表名即可——MySQL内部会通过系统表管理这些表的“引用”,你不用操心内存层面的引用维护。
2. 查找指定表的方式
MySQL查找指定表时也不会遍历所有表,它会先从information_schema.TABLES里快速查询目标表的元数据,而且MySQL还会把常用表的元数据缓存起来,下次访问更快。
比如你执行SELECT * FROM work_hours;,MySQL会先检查当前数据库的缓存里有没有这个表的信息,没有的话就去information_schema里查询,找到后直接定位到存储引擎的表数据区域,全程都是快速定位,不是遍历。
内容的提问来源于stack exchange,提问作者Miroslav

