MySQL常见问题及处理

MySQL常见问题及处理
Rainbow BubblesInnoDB
性能优秀主键所有速度快于其他索引,支持事务,支持行级锁
MyISM
不支持事务,支持表级锁
索引
- 大大减少服务器需要扫描的数据量
- 帮助服务器避免排序和临时表
- 将随即I/O变顺序I/O
- 大大提高查询速度,降低写速度,占用磁盘
种类
主键索引,组合索引,唯一索引,普通索引
原则
- 索引列是出现在where子句 中的列,或连接子句中的列
- 索引列的基数越大效果越好
- 对字符串进行索引,应该制订一个前缀的长度,可以节省大量的索引空间
- 根据情况创建复合索引,
- 避免创建过多的索引
- 选择字节较短的列作为索引,离散度较高的列作为索引
注意
- A or B 两个列必须都有索引,才会用到索引
- 列类型的字符串查询时一定要加双引号,否则索引失效
eg:请描述创建组合索引的方案。
优化
- 优化查询过程中的数据访问
- 优化长难的查询语句
- 优化特定类型的查询语句
- 分表
分析:
1 | set profiling = 1 |
方案:
- 多表关联查询指定查询列明(A.id,A.name)
- 查询数据量较多,使用limit解决
- 重复查询相同的数据,可以缓存数据,下次直接读取缓存
- 查询时是否在扫描额外的记录,如果存在就创建索引覆盖扫描
- 适当修改表的范式(第一,二,三范式)
- 尽可能的少查询请求(如果数据量很大,分解为多个查询也是有必要的)
- count() 中的会忽略所有的列,直接统计所有的列,因此不要使用count(列名)
- 关联查询时确定ON或者USING子句的列上有所以,避免全表扫描
- groupBy和orderBy中只有一个表的列,这样mysql才有可能使用索引
- 如果不需要orderBy,进行groupBy时使用orderBy NULL,mysql不会在进行文件排序
安全:
sql注入
分析
1 | user/delete/?id=1 or 1=1 |
方案
- sql语句预处理(prepare)
- 写入数据库的数据进行特殊字符的转译
- 错误信息不要返回给用户,记录到错误日志
评论
匿名评论隐私政策