Skip to content

Commit 5a14456

Browse files
author
chengwei2
committed
update
1 parent 4e4ef71 commit 5a14456

File tree

1 file changed

+13
-2
lines changed

1 file changed

+13
-2
lines changed

_posts/2017-10-22-数据库索引技术.md

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -220,8 +220,18 @@ title的选择性不足0.0001(精确值为0.00001579),所以实在没有
220220
### 结构优化
221221
* 在InnoDB中不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。
222222
* 在InnoDB中不建议用非单调的字段作为主键,因为InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择。
223+
* 为了兼顾索引的大小和查询速度,可以通过前缀索引(截取字段左边部分内容构建索引)的方式优化索引。
224+
* 尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
223225
### 查询优化
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。
225235

226236
### InnoDB的主键选择与优化
227237

@@ -233,4 +243,5 @@ title的选择性不足0.0001(精确值为0.00001579),所以实在没有
233243
[聚集索引、非聚集索引、聚集索引组织表、堆组织表、Mysql/PostgreSQL对比、联合主键/自增长、InnoDB/MyISAM(引擎方面另开一篇)](https://www.cnblogs.com/charlesblc/p/5983234.html)
234244
[聚集索引和非聚集索引(整理)](http://www.cnblogs.com/aspnethot/articles/1504082.html)
235245
[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

Comments
 (0)