一:慢查询原因
查询语句中存在计算逻辑
全表查询没有命中索引,或者没有索引
二:慢查询通常解决方式
1.检查是否正确使用并命中索引
2.避免使用select -解析过程会将转换所有列名,消耗更多的时间
3.Order By语句优化 - 使用的列建立索引 避免使用计算表达式
4.Group By 优化 - 筛选条件在Group By之前过滤掉
5.使用Exists代替in - in会导致全表扫描,连续的数值可以用Between And
6.使用varchar/nvarchard代替char/nchar - 变长字段的存储空间小
7.能用Union All 就不用Union - Union并集,会去除重复数据
8.索引不是越多越好 - 会降低 Insert和Update效率
索引类型
A. 主键索引(PRIMARY KEY) 建表的时候同时创建主键索引
B.唯一索引(UNIQUE) 索引列的值必须唯一,允许为空ALTER
TABLE table_name ADD UNIQUE (column)
C.普通索引
ALTER TABLE table_name ADD INDEX index_name (column)
D.组合索引 包含多个列
ALTER TABLE table_name ADD INDEX index_name(column1, column2, column3)
E.全文索引 利用分词技术多种算法智能分析文本中关键词的频率和重要性
ALTER TABLE table_name ADD FULLTEXT (column)
建索引原则
A. 最左匹配原则
-多列索引。总是从最前面开始,接着往后,中间不能跳过。
通常把使用最频繁的列放在最左边
B.选择区分度高的列
C.索引列不能参与计算
D.尽量拓展索引,不要新建索引 -已经有a的索引,修改原来索引变成(a,b)即可
有索引但未被用到情况:
Like 以通配符开头 - ‘%abc’ ‘abc%’ 才用到索引
Where条件不满足我最左匹配原则
使用!=或<>操作符
索引列参与计算
对字段进行null判断 - is null 可以设置默认值0
使用or链接条件 -使用Union All