|
l \G --查找那么是null的值,也会用到索引
explain select * from commpany2 where name is not null \G --也会用到索引
二:存在索引但不使用索引(索引没用上)
(1):如果MySQL估计使用索引比全表扫描更慢,则不适用索引。列如:如果列key_part1均匀分布在1到100之间,查询时使用索引就不是很好
select * from tableName where key_part1>1 and key_part<90;
(2):如果使用memory/heap 表并且where条件中不适用"="进行索引列,那么不会用到索引。heap表只是有在"="的条件下回使用索引。
(3):用or分割开的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的所有都不会被用到。
show index from sales \G
****注意******
如果你的sql语句中使用了 where and 什么 ,or 什么的时候,
and / or 前面和后面的字段必须都要加索引,如果只一个加索引那么where查询后面的整个索引将会失效->导致整个索引都用不上,最终索引是没有意义的
从上面可以发现只有year列上面有索引,如:
explain select * from sales where year=2001 or country='China' \G
(4):如果不是索引列的第一部分,如下列子:可见虽能在moeney上建有复合索引,但是由于money不是索引的第一列,
那么查询中这个索引也不会被MySQL使用
explain select * from sales2 where moneys=1 \G
(5):如果like是以为%开始,可能name字段有索引,但是由于条件中like的值得"%"号在第一位MySQL也不会使用索引
(6):如果列类型是字符串,但是在查询的时候把一个数值型常量给了一个字符型的列名name,
那么虽能name列上有索引,但是也没有用到
explain select * from company2 where name=294 \G --能找到记录你输入294的会自动转成'294',但是不会使用索引
三:查看所有使用情况
如果索引正在工作,Handler_red_key(读取索引的次数) 的值将很高。
Handler_read_rnd_next的值高则意味着查询运行低效,并且应该建立索引补救。
show status like 'Handler_red%'; --Handler_read_rnd_next这个值偏高得话就得结合慢查询日志,看看那个sql慢 进而来建索引
三:两个简单使用的优化方法
对于大多数开发人员来说,可能只希望掌握一些简单实用的优化方法,对于更多复杂的优化,更倾向交给作业DBA来做
(1):定期分析表和检查表
*分析的语法如下:(检查一个表或多个表是否有错误,比如视图:视图依赖一个主表,主表删除了,能后你用这个命令查看你的视图表就会报错)
check table table_name;
(2):定期优化表
优化表的语法格式:
就是优化表空间->删除等操作一些碎片和空洞清理出去
optimize table table_name; --如果已经删除了表的一大部分,或者已经对含有可变长度的表进行了很多的改动,则需要
做定期优化。这个命令可以将表中的空间碎片进行合并,但是次命令只对myiam bdb和innodb表起作用。
四:常用SQL的优化
(1):大批量插入数据
一:当用load命令导入数据的时候。适当设置可以提高导入的速度。 ?load data
导出 导入数据 新方法:
select name from t1 into outfile "/tmp/test.txt"; --将表t1 name字段数据导出到文件里去
load data infile "/tmp/test.txt" into table t1(name); --清空表t1,在将刚才导出来的t1表name字段的数据值在导入t1表中的name中去
二:对于myisam存储引擎的表,可以通过以下方式快速的导入大量的数据。
注意:一般指关闭非唯一索引,以为怕导入的时候有相同的值就监控不到啦
插入完后再一起做索引,否则每次插入一条索引文件也插入一条
alter table table_name disable keys
load data .....
alter table table_name enable keys
-->disable keys 和 enable keys 用来打开或关闭myisam表非唯一索引(除了住建索引)的更新,可以提高速度 innodb 无效的哦
->1:使用打开或关闭MyISAM非唯一索引(表已经建立了索引):
alter table table_Name disable keys; --关闭
load data infile "/tmp/test.txt" into table t1(name); --导入数据后在统一价索引
alter table table_Name enable keys; --开启,统一加索引
->2:关闭唯一索引,可以提高导入效率(保证你数据不会有问题,不会出现冲突值、重复啥的)
在导入数据前先执行set unique_checks=0,关闭唯一性效验,在导入数据后先执行set unique_checks=1,恢复唯一效验,可以提高导入效率
SQL:
set unique_checks=0;
load data infile "/tmp/test.txt" into table t1(name);
set unique_checks=1;
三:针对于Innodb类型表数据导入的优化
1:因为innodb表的按照主键顺序保存的,所以将导入的数据主键的顺序呢排序,可以有效地提高导入数据的效率。
使用test3.txt文本是按表film_test4主键存储顺序保存
load data infile "/tmp/test.txt" into table film_test4;
2:关闭自动提交可以提高导入效率
在导入数据前先执行set autocommit=0,关闭自动提交事务,在导入数据后先执行set autocommit=1,恢复自动提交,可提高效率。
set autocommit=0;
load data infile "/tmp/test.txt" into table film_test4;
set autocommit=1;
四:优化insert语句:
尽量使用多个值表的insert语句,这样可以大大缩短客户与数据库之间的链接、关闭损耗。
可以尽量使用insert delayed(马上执行)语句得到更高得效率。
将索引文件盒数据文件分别存放不同的磁盘上。
可以增加bulk_inser_buffer_size变量值得方法来提高速度,但是只是对myisam表使用。
当从一个文 |