面试题总结——mysql优化篇

MySQL复习题

Mysql的优化

  1. 使用查询缓存优化查询
  2. EXPLAIN select查询:explain的查询结果会告诉你索引主键是如何被利用的;
  3. 只需要查询一行数据时使用limit 1
  4. 为搜索字段加索引
  5. 关联表时采用相当类型的例,并将其索引
  6. 千万不用使用order by rand()
  7. 避免select *
  8. 永远为每张表设置一个ID
  9. 使用ENUM而不是VARCHAR
  10. 从proceure analysis()提取建议
  11. 尽可能使用NOT NULL
  12. Java中使用prepared statements
  13. 无缓冲的查询
  14. 把IP地址存成UNISGNED INT
  15. 固定表的长度
  16. 越小的列会越快
  17. 选择正确的存储引擎
  18. 使用一个对象关系映射器
  19. 小心永久链接
  20. 拆分大的DELETE或INSERT语句

二、 SQL优化会不会?说出你知道的

  1. 避免在列上做运算,可能会导致索引失败
  2. 使用join时应该小结果驱动大结果集,同时把复杂的join查询拆分成多个query,不然join越多表,会导致越多的锁定和阻塞。
  3. 注意like模糊查询的使用,避免使用%%
  4. 不要使用select * 节省内存
  5. 使用批量插入语句,节省交互
  6. Limit基数比较大时,使用between and
  7. 不要使用rand函数随机获取记录
  8. 避免使用null,建表时,尽量not null,提高查询性能
  9. 不要使用count(id),应该使用count(*)
  10. 不要做无所谓的排序,尽可能在索引中完成排序
  11. From语句中一定不要使用子查询
  12. 使用更多的where加以限制,缩小查找范围
  13. 合理利用索引
  14. 使用explain查看SQL性能

mysql数据库中,什么情况下设置了索引但无法使用?

  1. **索引的作用:**在数据库中对字段简历索引可以大大的提高查询速度。

  2. Mysql索引类型:

    1. 普通索引

    2. 唯一索引列的值必须唯一允许有空值,如果是组合索引,则列值的组合必须唯一:

      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)) );

    3. 主键索引:一种特殊的唯一索引,不允许有空值,一般在创建表的时候创建主键索引:

      CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, PRIMARY KEY(ID) );

    4. 组合索引: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);

  3. 什么情况下有索引,但用不上?

    1. 如果条件中有OR,即使其中有部分条件带索引也不会使用。注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引。
    2. 对于多了索引,不是使用的第一部分,则不会使用索引。
    3. Like查询以%开头,不使用索引
    4. 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
    5. Where 子句里对索引列上有数学运算或使用函数时,都用不上索引
    6. Mysql估计使用全表扫描要比用索引快,不使用索引
  4. 什么情况下不推荐使用索引?

    1. 数据唯一性差的字段不要使用索引
    2. 频繁更新的字段不要使用索引
    3. 字段不在where语句中出现时不要添加索引,如果where后包含IS NULL/IS NOT NULL/LIKE ‘%输入符%’等条件,不要使用索引
    4. where子句里对索引使用不等于(<>),不建议使用索引,效果一般

三、 mysql的存储引擎

存储引擎说明
MyISAM高速索引,拥有较高的插入,查询速度,但不支持事务
InnoDB5.5版本后MySQL默认数据库,支持事务和行级锁定,比MyISAM处理速度稍慢
ISAMMyISAM的前身,MySQL5.0后不再默认安装
MRG_MyISAM(MERGE)将多个表合成一个表使用,在超大规模数据存储时很有用
Memory内存存储引擎,拥有极高的插入,更新和查询效率。但会占用和数据量成正比的内存空间。只才内存上保存数据,意味着数据可能会丢失。
Falcon一种新的存储引擎支持事务处理
Archive将数据压缩后进行存储,非常适合存储大量的独立的,作为历史记录的数据,但是只能进行插入和查询操作。
CSVCSV存储引擎是基于CSV格式文件存储数据(应用于夸平台的数据交换)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值