@@ -220,8 +220,18 @@ title的选择性不足0.0001(精确值为0.00001579),所以实在没有
220
220
### 结构优化
221
221
* 在InnoDB中不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。
222
222
* 在InnoDB中不建议用非单调的字段作为主键,因为InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择。
223
+ * 为了兼顾索引的大小和查询速度,可以通过前缀索引(截取字段左边部分内容构建索引)的方式优化索引。
224
+ * 尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
223
225
### 查询优化
224
-
226
+ * Where、Group by、Order by时使用的字段要尽可能遵循最左前缀原则,否则无法使用到索引。
227
+ * 对查询进行优化,应尽量避免全表扫描,首先应考虑在 Where、Group by、Order by 涉及的列上建立索引。
228
+ * 尽量使用覆盖索引(只访问索引的查询(查询的列与索引的列一致)),尽量避免select * 。
229
+ * 尽量避免查询无法使用索引的情况:
230
+ * Mysql5.7之前查询条件中含有函数或表达式时无法使用索引,故查询条件中尽量避免出现表达式,而是先手动运算,转换为无表达式的查询语句。
231
+ * 字段值为Null时无法使用索引,故要索引的字段在创建时要尽可能设置默认值。
232
+ * 在 where 子句中使用!=或<>操作符时字段无法使用索引。
233
+ * like以通配符(%)开头的字段查询无法使用索引,故查询应尽量避免此种情况。
234
+ * 在 where 子句中使用or时,必须or表达式中的字段都建有索引,否则无法使用索引,若要使用索引可以通过union替代or。
225
235
226
236
### InnoDB的主键选择与优化
227
237
@@ -233,4 +243,5 @@ title的选择性不足0.0001(精确值为0.00001579),所以实在没有
233
243
[ 聚集索引、非聚集索引、聚集索引组织表、堆组织表、Mysql/PostgreSQL对比、联合主键/自增长、InnoDB/MyISAM(引擎方面另开一篇)] ( https://www.cnblogs.com/charlesblc/p/5983234.html )
234
244
[ 聚集索引和非聚集索引(整理)] ( http://www.cnblogs.com/aspnethot/articles/1504082.html )
235
245
[ Mysql技术内幕——InnoDB存储引擎] ( https://jingyan.baidu.com/article/fedf07377c493f35ac89770c.html )
236
- [ oracle索引原理(b-tree,bitmap,聚集,非聚集索引)] ( http://blog.csdn.net/chenleixing/article/details/48153295 )
246
+ [ oracle索引原理(b-tree,bitmap,聚集,非聚集索引)] ( http://blog.csdn.net/chenleixing/article/details/48153295 )
247
+ [ mysql关于or的索引问题] ( http://www.cnblogs.com/yuerdongni/p/4255395.html )
0 commit comments