一 数据类型优化 :
在创建某个字段的时候,尽量选择该数据能存的最小数据类型,
1、整型比字符操作代价更低,因为字符集和校对规则是字符比较比整型比较更复杂,
2、使用mysql自建类型而不是字符串来存储日期和时间
3、用整型存储IP地址
列:具体需要找类型优化
varchar(1),int(1) ()
varchar(5),varchar(255) (他们在硬盘存的大小一致,但是内存中是设置长度的大小)
mysql的整数类型(TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT分别使用8,16,24,32,64) 都有一特点,他们的int(x) x不是长度,不管设置的x是几,会在硬盘中存一个他们的固定长度,8,16,24,32,64。
所以INT(1)与INT(11)后的括号中的字符表示显示宽度,整数列的显示宽度与MySQL需要用多少个字符来显示该列数值,与该整数需要的存储空间的大小都没有关系,INT类型的字段能存储的数据上限还是2147483647(有符号型)和4294967295(无符号型)。其实当我们在选择使用INT的类型的时候,不论是INT(1)还是INT(11),它在数据库里面存储的都是4个字节的长度。
二 索引优化
数据库存储数据的时候,分为数据页,和索引页。
1:如果不建立索引,会直接去数据页去一个个对比
2:如果建立的索引,先去索引页查询,在通过索引页对应到的数据页去查询数据页
如果我现在有查询1000条数据,这个表就有1000条数据,这样用索引是不是就慢,前提不是索引覆盖,
如果这个表有100000 是不是就体现了索引的价值
1.添加PRIMARY KEY(主键索引,主键索引会把数据,也存在索引页中,索引一般用主键存查询会很快)
mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
2.添加UNIQUE(唯一索引)
mysql>ALTER TABLE `table_name` ADD UNIQUE (
`column`
)
3.添加INDEX(普通索引)
mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
4.添加FULLTEXT(全文索引) (只有MyISAM 引擎)
mysql>ALTER TABLE `table_name` ADD FULLTEXT ( `column`)
5.添加多列索引
mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
三 索引匹配方式:
如果设置的索引是 name,age,pos。
1:全值匹配
全值匹配指的是和索引中的所有列进行匹配
explain select * from staffs where name = 'July' and age = '23' and pos = 'dev';
2:匹配最左前缀
只匹配前面的几列(只能按照顺序索引,顺序必须是 name,age,pos,如果where按照 pos,name,age将不能执行索引查询)
explain select * from staffs where name = 'July' and age = '23';
explain select * from staffs where name = 'July';
3:匹配列前缀 (这样查询虽然用到索引了但是相比于全职匹配速度还是慢)
可以匹配某一列的值的开头部分
explain select * from staffs where name like 'J%';
explain select * from staffs where name like '%y';
4:匹配范围值(因为第一个是name,之后的匹配都不算索引)
可以查找某一个范围的数据
explain select * from staffs where name > 'Mary';
5:精确匹配某一列并范围匹配另外一列
可以查询第一列的全部和第二列的部分
explain select * from staffs where name = 'July' and age > 25;
四 常见sql使用索引