索引对性能的影响

1、大大减少对服务器需要扫描的数据量
2、帮助服务器避免排序和临时表
3、将随机I/O变顺序I/O
4、大大提高查询速度,降低写的速度、占用磁盘

索引的类型

普通索引:最基本的索引,没有任何约束限制
唯一索引:与普通所以类似,但是具有唯一约束性
主键索引:特殊的唯一索引,不允许有空值

唯一索引与主键索引的不同

一个表只能有一个主键索引,可以有多个唯一索引
主键索引一定是唯一索引,唯一索引不是主键索引
主键可以与外键构成参照完整性约束,防止数据不一致

组合索引:将多个列组合在一起创建索引,可以覆盖多个列
外键索引:只有InnoDB类型的表才可以使用外键索引,保证数据的一致性、完整性和实现级联操作
全文索引:MySQL自带的全文索引只能用于MyISAM,并且只能对英文进行全文检索

MySQL索引的创建原则

1、最适合索引的列是出现在WHERE子句中的列,或连接子句中的列而不是出现在 SELECT 关键字后的列
2、索引列的基数越大,索引的效果越好
3、对字符串进行索引,应该制定一个前缀长度,可以节省大量的索引空间
4、根据情况创建复合索引,复合索引可以提高查询效率
5、避免创建过多索引,索引会额外占用磁盘空间,降低写操作效率
6、主键尽可能选择较短的数据类型,可以有效减少索引的磁盘占用提高查询效率

注意:

1、复合索引遵循前缀原则
2、like查询,%不能在前,可以使用全文索引
3、coIumn is null可以使用索引
4、如果MySQL估计使用索引比全表扫描更慢,会放弃使用索引
5、如果or前的条件中的列有索引,后面的没有,索引都不会被用到
6、列类型是字符串,查询时一定要给值加引号,否则索引失效

MySQL的安全性考察点

1、使用预处理语句防SQL注入
2、写入数据库的数据要进行特殊字符的转义
3、查询错误信息不要返回给用户,将错误记录到日志
注意:PHP端尽量使用PDO对数据库进行相关操作,PDO拥有对顺处理语句很好的支持的方法,MySQLi也有,但是可扩展性不如PDO,效率略高于PDO,MySQL函数在新版本中已经趋向于淘汰,所以不建议使用,而且它没有很好的支持顺处理的方法。

MySQL的其他安全设置

1、定期做数据备份
2、不给查询用户root权限,合理分配权限
3、关闭远程访问数据库权限
4、修改root口令,不用默认口令,使用较复杂的口令
5、删除多余的用户
6、改变root用户的名称
7、限制一般用户浏览其他库
8、限制用户对数据文件的访问权限

MySQL 分区的使用场景与工作原理

适用场景
1、表非常大,无法全部存在内存,或者只在表的最后有热点数据,其他都是历史数据
2、分区表的数据更易维护,可以对独立的分区进行独立的操作
3、分区表的数据可以分布在不同的机器上,从而高效使用资源
4、可以使用分区表来避免某些特殊的瓶颈
5、可以备份和恢复独立的分区

限制
1、一个表最多只能有1024个分区
2、5·1版本中,分区表表达式必须是整数,5·5可以使用列分区
3、分区字段中如果有主键和唯一索引列,那么主键列和唯一列都必须包含进来
4、分区表中无法使用外键约束
5、需要对现有表的结构进行修改
6、所有分区都必须使用相同的存储引擎
7、分区函数中可以使用的函数和表达式会有一些限制
8、某些存储引擎不支持分区
9、对于MylSAM的分区表,不能使用loadindexintocache
10、对于MylSAM表,使用分区表时需要打开更多的文件描述符

工作原理
通过一些HASH算法或者工具实现将一张数据表垂直或者水平进行物理切分

MySQL查询相关

分析SQL查询慢的方法
1、记录慢询日志,分析查询日志,不要直接打开慢查询日志进行分析,可以使用 pt-query-digest 工具进行分析
2、show profile
set profiling=l;启用服务器上执行的所有语句会检测消耗的时间,存到临时表中
show profiles
show profile for query 临时表ID
3、show status
show status会返回一些计数器,showglobal看服务器级别的所有计数
4、show processlist 观察是否有大量线程处于不正常的状态或者特征
5、explain (desc 别名)

优化查询过程中的数据访问

访问数据太多导致查询性能下降

1、避免使用如下SQL语句
查询不需要的记录,使用limit解决
多表关联返回全部列,指定A.id,A.name,B.age
总是取出全部列,SELECT*会让优化器无法完成索引覆盖扫描的优化
重复查询相同的数据,可以缓存数据,下次直接读取缓存

2、是否扫描额外记录
使用explain来进行分折,如果发现查询需要扫描大量的数据但只返回少数的行,可以通过如下技巧去优化:
使用索引覆盖扫描,把所有用的列都放到索引中,这样存储引擎不需要回表获取对应行就可返回结果

3、改变数据库和表的结构,修改数据表范式
重写SQL语句,让优化器可以以更优的方式执行询

优化长难的查询语句

一个复杂查询还是多个简单查询
切分查询
分解关联查询

优化特定类型的查询语句
优化count()查询
优化关联查询
优化子查询
优化GROUPBY和DISTINCT
优化LIMIT分页
优化union查询

发表评论

电子邮件地址不会被公开。 必填项已用*标注