使用索引可以不需要执行全表扫描,从而可以极大的提高搜索速度。
在执行连接多个表的查询时,索引发挥的作用更大。(多表联查是笛卡尔积)
使用索引的方式
索引可以用于加快对where子句匹配的行进行搜索的速度,或多个表中行匹配行的速度。
使用min()函数或max()函数,MySQL可以在不用逐行检查的情况下,快速找到。B+树中的(2,3)
对于order by 和group by子句,MySQL经常使用索引来高效地完成分类和分组操作。
索引的代价
索引在时间和空间上都有成本。
首先,索引可以加快检索速度,但是它同时也降低了索引列插入、删除和更新的速度。
也就是说,索引降低了大部分写入相关操作的速度。因为写入不仅是写入一个数据行,还要更改索引。
索引越多,需要做出更改就越多。
挑选索引
where、group by、order by、on、using 中的列被称为索引候选列






查询优化的工作原理
查询时 小在前,大在后
这样未匹配的行少。比如两个列c1(900),c2(300)联查有30 行, 先查c1 会有870行不匹配的,而先查c2只有270行
使用explain验证优化
比较拥有相同数据类型的列
数据类型相同比数据类型不同的情况相比,查询性能会提高很多
char(10) 与char(10)、varchar(10)是同类型的
char(10) 与char(12)、varchar(12)是不同类型的
可以使用alter table语句来修改其中的一个,来使得类型相匹配
不要在like 模式下开始位置使用通配符%
使用 like x% 查询是可以用得到索引的,而使用 like %x% 和 like %x 查询是用不到索引的
因为索引是一种有序的 B+ Tree 数据结构,叶子节点都是按照顺序从左向右排的,如果使用 like %x% 和 like %x 查询的话,不知道开头是哪个,就会去进行全表扫描

联合索引下使用%
选择利于高效查询的数据类型
多用数字运算,少用字符串运算
数字之间的比较,可以在一个运算里完成,而字符串之间的比较,需要多次进行多字节与字节、或字符串与字符串的比较才能完成
IP地址转换


当小数据类型够用,就不要用大数据类型
把数据列声明为not null
这样在查询期间,就不用考虑该列的值是否未null
考虑enum列
如果字符串列的基数低(差异值个数少),可以考虑把它转换成enum列。enum值的处理速度很快,因为它们的内部表示形式皆为数字
使用procedure analyse()

高效加载数据
load data 比 insert into效率高
mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20),-> species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);
mysql> load data local infile 'D:/java/opensource/mysql/pet.txt' into table pet;
Query OK, 1 row affected (0.00 sec)
Records: 1 Deleted: 0 Skipped: 0 Warnings: 0
show profiles
索引不参与运算
有索引不作为函数的参数

