MySQL复习题
Mysql的优化
- 使用查询缓存优化查询
- EXPLAIN select查询:explain的查询结果会告诉你索引主键是如何被利用的;
- 只需要查询一行数据时使用limit 1
- 为搜索字段加索引
- 关联表时采用相当类型的例,并将其索引
- 千万不用使用order by rand()
- 避免select *
- 永远为每张表设置一个ID
- 使用ENUM而不是VARCHAR
- 从proceure analysis()提取建议
- 尽可能使用NOT NULL
- Java中使用prepared statements
- 无缓冲的查询
- 把IP地址存成UNISGNED INT
- 固定表的长度
- 越小的列会越快
- 选择正确的存储引擎
- 使用一个对象关系映射器
- 小心永久链接
- 拆分大的DELETE或INSERT语句
二、 SQL优化会不会?说出你知道的
- 避免在列上做运算,可能会导致索引失败
- 使用join时应该小结果驱动大结果集,同时把复杂的join查询拆分成多个query,不然join越多表,会导致越多的锁定和阻塞。
- 注意like模糊查询的使用,避免使用%%
- 不要使用select * 节省内存
- 使用批量插入语句,节省交互
- Limit基数比较大时,使用between and
- 不要使用rand函数随机获取记录
- 避免使用null,建表时,尽量not null,提高查询性能
- 不要使用count(id),应该使用count(*)
- 不要做无所谓的排序,尽可能在索引中完成排序
- From语句中一定不要使用子查询
- 使用更多的where加以限制,缩小查找范围
- 合理利用索引
- 使用explain查看SQL性能
mysql数据库中,什么情况下设置了索引但无法使用?
-
**索引的作用:**在数据库中对字段简历索引可以大大的提高查询速度。
-
Mysql索引类型:
-
普通索引
-
唯一索引列的值必须唯一允许有空值,如果是组合索引,则列值的组合必须唯一:
CREATE UNIQUE INDEX indexName ON mytable(username(length))
– 修改表结构
ALTER mytable ADD UNIQUE [indexName] ON (username(length))
– 创建表的时候直接指定
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, UNIQUE [indexName] (username(length)) );
-
主键索引:一种特殊的唯一索引,不允许有空值,一般在创建表的时候创建主键索引:
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, PRIMARY KEY(ID) );
-
组合索引:
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, city VARCHAR(50) NOT NULL, age INT NOT NULL );
为了进一步榨取MySQL的效率,就要考虑建立组合索引。就是 将 name, city, age建到一个索引里:代码如下:
ALTER TABLE mytable ADD INDEX name_city_age (name(10),city,age);
-
-
什么情况下有索引,但用不上?
- 如果条件中有OR,即使其中有部分条件带索引也不会使用。注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引。
- 对于多了索引,不是使用的第一部分,则不会使用索引。
- Like查询以%开头,不使用索引
- 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
- Where 子句里对索引列上有数学运算或使用函数时,都用不上索引
- Mysql估计使用全表扫描要比用索引快,不使用索引
-
什么情况下不推荐使用索引?
- 数据唯一性差的字段不要使用索引
- 频繁更新的字段不要使用索引
- 字段不在where语句中出现时不要添加索引,如果where后包含IS NULL/IS NOT NULL/LIKE ‘%输入符%’等条件,不要使用索引
- where子句里对索引使用不等于(<>),不建议使用索引,效果一般
三、 mysql的存储引擎
存储引擎 | 说明 |
---|---|
MyISAM | 高速索引,拥有较高的插入,查询速度,但不支持事务 |
InnoDB | 5.5版本后MySQL默认数据库,支持事务和行级锁定,比MyISAM处理速度稍慢 |
ISAM | MyISAM的前身,MySQL5.0后不再默认安装 |
MRG_MyISAM(MERGE) | 将多个表合成一个表使用,在超大规模数据存储时很有用 |
Memory | 内存存储引擎,拥有极高的插入,更新和查询效率。但会占用和数据量成正比的内存空间。只才内存上保存数据,意味着数据可能会丢失。 |
Falcon | 一种新的存储引擎支持事务处理 |
Archive | 将数据压缩后进行存储,非常适合存储大量的独立的,作为历史记录的数据,但是只能进行插入和查询操作。 |
CSV | CSV存储引擎是基于CSV格式文件存储数据(应用于夸平台的数据交换) |