💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# mysql概念和性能优化 #### ID自增主键 一张表中,ID 自增主键,当 insert 了 10 条记录之后,删了第8,9,10条记录,MYSQL 重启,再 insert 一条记录,这条记录的 ID 是 11 还是 8 ? 答案是: 1. 当表类型是 MyISAM,那么 ID 是11,**因为 MyISM 表会把自增主键的最大 ID 记录到数据库文件**,重启 MySQL 自增主键的 ID 也不会丢失 2. 当表类型是 InnoDB,那么是 8,**InnoDB 表只是会把自增主键的最大 ID 记录到内存中**,所以重启数据库或者对表进行 OPTIMIZE 操作,都会导致最大的 ID 丢失。 #### SELECT \* 和 SELECT 全部字段的 2 种写法有何优缺点? 1. 前者要解析数据字典,后者不需要 2. 结果输出顺序,前者与建表列顺序相同,后者按指定字段顺序 3. 表字段改名,前者不需要修改,后者需要修改 4. 后者可以建立索引进行优化,前者无法优化 5. 后者的可读性比前者要高 #### 字段排除 如果我希望获取排除数据表中的`content`字段(文本字段的值非常耗内存)之外的所有字段值,我们就可以使用field方法的排除功能,例如下面的方式就可以实现所说的功能: ``` <pre class="calibre13">``` Db<span class="token1">:</span><span class="token1">:</span><span class="token3">table</span><span class="token1">(</span><span class="token4">'user'</span><span class="token1">)</span><span class="token">-</span><span class="token">></span><span class="token3">withoutField</span><span class="token1">(</span><span class="token4">'content'</span><span class="token1">)</span><span class="token">-</span><span class="token">></span><span class="token3">select</span><span class="token1">(</span><span class="token1">)</span><span class="token1">;</span> ``` ``` 则表示获取除了content之外的所有字段,要排除更多的字段也可以: ``` <pre class="calibre13">``` Db<span class="token1">:</span><span class="token1">:</span><span class="token3">table</span><span class="token1">(</span><span class="token4">'user'</span><span class="token1">)</span><span class="token">-</span><span class="token">></span><span class="token3">withoutField</span><span class="token1">(</span><span class="token4">'user_id,content'</span><span class="token1">)</span><span class="token">-</span><span class="token">></span><span class="token3">select</span><span class="token1">(</span><span class="token1">)</span><span class="token1">;</span> <span class="token6">//或者用</span> Db<span class="token1">:</span><span class="token1">:</span><span class="token3">table</span><span class="token1">(</span><span class="token4">'user'</span><span class="token1">)</span><span class="token">-</span><span class="token">></span><span class="token3">withoutField</span><span class="token1">(</span><span class="token1">[</span><span class="token4">'user_id'</span><span class="token1">,</span><span class="token4">'content'</span><span class="token1">]</span><span class="token1">)</span><span class="token">-</span><span class="token">></span><span class="token3">select</span><span class="token1">(</span><span class="token1">)</span><span class="token1">;</span> ``` ``` #### 提交的字段合法性检测 除了查询操作之外,`field`方法还有一个非常重要的安全功能--**字段合法性检测**。`field`方法结合数据库的写入方法使用就可以完成表单提交的字段合法性检测,如果我们在表单提交的处理方法中使用了: ``` <pre class="calibre13">``` Db<span class="token1">:</span><span class="token1">:</span><span class="token3">table</span><span class="token1">(</span><span class="token4">'user'</span><span class="token1">)</span><span class="token">-</span><span class="token">></span><span class="token3">field</span><span class="token1">(</span><span class="token4">'title,email,content'</span><span class="token1">)</span><span class="token">-</span><span class="token">></span><span class="token3">insert</span><span class="token1">(</span>$data<span class="token1">)</span><span class="token1">;</span> ``` ``` 即表示表单中的合法字段只有`title`,`email`和`content`字段,无论用户通过什么手段更改或者添加了浏览器的提交字段,都会直接屏蔽。因为,其他所有字段我们都不希望由用户提交来决定,你可以通过自动完成功能定义额外需要自动写入的字段。 > 在开启数据表字段严格检查的情况下,提交了非法字段会抛出异常,可以在数据库设置文件中设置: > ``` > <pre class="calibre15">``` > <span class="token6">// 关闭严格字段检查</span> > <span class="token4">'fields_strict'</span> <span class="token">=></span> <span class="token5">false</span><span class="token1">,</span> > > ``` > ```